LeetCode第16题: threeSumClosest(C语

2019-08-26  本文已影响0人  闫品品

上一题: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语言)

上一篇下一篇

猜你喜欢

热点阅读