目录
Leecode-16-最接近的三数之和
题目
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
示例
示例1
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
示例2
输入:nums = [0,0,0], target = 1
输出:0
解题思路
- 使用
qsort()
函数对nums数组进行排序,排序规则为cmp
函数定义的升序 - sum:用于存储当前三个数的和。
flag:用于存储最接近目标值的和,初始化为一个较大的数(1e7) - 使用一个外层循环遍历数组nums,跳过重复的元素,避免重复计算
- 在当前外层循环确定的元素nums[i]的基础上,使用两个指针j和k分别指向nums[i]的下一个元素和数组末尾。
通过移动j和k,尝试找到与nums[i]相加最接近target的两个数。
· 如果sum等于target,直接返回target。
· 如果abs(sum - target)小于abs(flag - target),更新flag。
根据sum和target的大小关系,移动指针j或k,并跳过重复的元素 - 返回最接近目标值的和flag
代码实现
c
int cmp(const void* a,const void* b){
return *(int*)a-*(int*)b;
}
int threeSumClosest(int* nums, int numsSize, int target) {
int sum = 0;
qsort(nums,numsSize,sizeof(int),cmp);
int flag = 1e7;
int i,j,k;
for(i = 0;i < numsSize ; i++){
if(i > 0 && nums[i] == nums[i - 1]){
continue;
}
j = i + 1;
k = numsSize - 1;
while(j < k){
sum = nums[i] + nums[j] + nums[k];
if (sum == target) {
return target;
}
if (abs(sum - target) < abs(flag - target)) {
flag = sum;
}
if(sum > target){
int num2 = nums[k];
k = k - 1;
while(j < k && nums[k] == num2){
k--;
}
}else{
int num1 = nums[j];
j = j + 1;
while(j < k && nums[j] == num1){
j++;
}
}
}
}
return flag;
}
Leecode-面试题01.07-旋转矩阵
题目
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
不占用额外内存空间能否做到?
示例
示例1
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
示例2
给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
解题思路
- 创建临时矩阵:首先,函数创建了一个与原始矩阵
matrix
同样大小的临时矩阵new
,并将原始矩阵中的元素复制到临时矩阵new中 - 旋转矩阵:接下来,函数再次通过两个嵌套的for循环遍历临时矩阵new的每一个元素。对于new矩阵中的每个元素new[i][j],它将被赋值给matrix[j][matrixSize - i - 1]。这个操作实现了矩阵的顺时针旋转90度。具体来说,如果原始矩阵中的某个元素位于第i行第j列,那么在旋转后的矩阵中,它应该位于第j行第(matrixSize - i - 1)列
代码实现
c
void rotate(int** matrix, int matrixSize, int* matrixColSize) {
int new[matrixSize][matrixSize];
for (int i = 0; i < matrixSize; i++) {
for (int j = 0; j < matrixSize; j++) {
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] = new[i][j];
}
}
}