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];
}
}
}

浙公网安备 33010602011771号