leetbook

数组

寻找数组的中心索引

给你一个整数数组 nums ,请计算数组的 中心下标 。

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。

实例

输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等
int pivotIndex(int* nums,int numsSize){
    int total=0;
    for(int i=0;i<numsSize;i++){
        total+=nums[i];			//数组元素之和
    }
    int sum=0;
    for(int i=0;i<numsSize;i++){
        if(2*sum+nums[i]==total){	//total中心左边左边的元素之和sum和nums[i],如果还与sum相等,i为中心坐标
            return i;				//total-sum-nums[i]==sum -> 2*sum+nums[i]==total
        }
        sum+=nums[i];
    }
}

搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

示例

输入: nums = [1,3,5,6], target = 5
输出: 2
输入: nums = [1,3,5,6], target = 2
输出: 1
输入: nums = [1,3,5,6], target = 7
输出: 4
int searchInsert(int* nums, int numsSize, int target) {
    for(int i=0;i<numsSize;i++){
        if(nums[i]>=target){		//当数组元素大于或者等于目标数则i为插入位置或者是与目标数相等的位置数
            return i;
        }
    }
    return numsSize;
}

旋转矩阵

给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。

不占用额外内存空间能否做到?

示例

给定 matrix = 
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
],

原地旋转输入矩阵,使其变为:
[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]

我们将其翻译成代码。由于矩阵中的行列从 00 开始计数,因此对于矩阵中的元素 \(\textit{matrix}[\textit{row}][\textit{col}]\),在旋转后,它的新位置为$ \textit{matrix}\textit{new}[\textit{col}][n - \textit{row} - 1] 即 matrix[col][n−row−1]=matrix[row][col]$

void rotate(int** matrix, int matrixSize, int* matrixColSize){
    int matrix_new[matrixSize][matrixSize];
    for(int i=0;i<matrixSize;i++){
        for(int j=0;j<matrixSize;j++){
            matrix_new[i][j]=matrix[i][j];
        }
    }
    for(int i=0;i<matrixSize;i++){
        for(int j=0;j<matrixSize;j++){
            matrix[j][matrixSize-i-1]=matrix_new[i][j];
        }
   }
}
posted @ 2024-04-10 01:12  lkylin070  阅读(9)  评论(0)    收藏  举报