上一题:LeetCode第15题: threeSum(C语言)
思路:首先将数组进行快速排序,从左至右开始遍历,找到sum = target的临界点i,对于i左侧,sum < target;对于i右侧,sum > target;并分别将其存到min和max中,然后分别比较max与target的距离、min与target的距离,返回其中距离最近的一个。
void quickSort(int *nums, int left, int right){
if(left < right){
int i = left;
int j = right + 1;
int pivot = nums[i];
do{
do{
i++;
}while(nums[i] < pivot);
do{
j--;
}while(nums[j] > pivot);
if(i < j){
int temp1 = nums[i];
nums[i] = nums[j];
nums[j] = temp1;
}
}while(i < j);
int temp2 = nums[left];
nums[left] = nums[j];
nums[j] = temp2;
quickSort(nums, left, j - 1);
quickSort(nums, j + 1, right);
}
}
int threeSumClosest(int* nums, int numsSize, int target){
quickSort(nums, 0, numsSize - 1);
int min = nums[0];
int max = nums[0];
int sum = 0;
for(int i = 0; i < numsSize - 2; i++){
sum = nums[i] + nums[i + 1] + nums[i + 2];
if(sum < target)
min = sum;
else if(sum == target)
return target;
else{
max = sum;
break;
}
}
if(max - target >= target - min)
return min;
else
return max;
}
本系列文章,旨在打造LeetCode题目解题方法,帮助和引导同学们开阔学习算法思路,由于个人能力和精力的局限性,也会参考其他网站的代码和思路,如有侵权,请联系本人删除。
下一题:LeetCode第17题: letterCombinations(C语言)