leetcode(16) 3Sum Closest解题报告

链接:https://leetcode.com/problems/3sum-closest/


题目:16. 3Sum Closest 


Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

    For example, given array S = {-1 2 1 -4}, and target = 1.

    The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).


解答思路:

(1)首先进行排序,使用快排

(2)然后循环数组,固定第一个数,然后用两个指针,一个指向固定数后面的第一个数(即最小数),另一个

指向最后一个数(即最大数)。

(3)然后将固定数和两个指针指向的数进行相加,得到sum

(4)看sum和target相差多大,如果相差变小,则closestTarget存储当前最小差值的sum

(5)如果sum大于target,则右指针前移,让sum变小;若sum小于target,则左指针后移,让sum变大;若相等则直接退出。

(6)最终返回保存的满足最小差值的closetTarget


C语言实现:

#include


void quickSort(int *nums, int first, int end) {
    if (first >= end) return;
    int left = first;
    int right = end;
    int p = nums[left];
    while (left < right) {
        while (left < right && nums[right] >= p) {
            right--;
        }
        if (left < right) {
            nums[left] = nums[right];
        }
        while (left < right && nums[left] <= p) {
            left++;
        }
        if (left < right) {
            nums[right] = nums[left];
        }
    }
    nums[left] = p;
    quickSort(nums, first, left-1);
    quickSort(nums, left+1, end);
}


int threeSumClosest(int* nums, int numsSize, int target) {
    quickSort(nums, 0, numsSize-1);
    int closestTarget = nums[numsSize-3] + nums[numsSize-2] + nums[numsSize-1];
    int minDis = (closestTarget - target) * (closestTarget - target);
    //printf("===closetTarget===%d\n", closestTarget);
    for (int i = 0; i < numsSize; i++) {
        if ( i > 0 && nums[i] == nums[i-1]) {
            continue;
        }
        int begin = i+1;
        int end = numsSize-1;
        int sum = 0;
        int dis = 0;
        while (begin < end) {
            sum = nums[begin] + nums[end] + nums[i];
            dis = (sum - target) * (sum -target);
            if (dis < minDis) {
                minDis = dis;
                closestTarget = sum;
            }
            if (sum > target) {
                end--;
            } else if (sum < target) {
                begin++;
            } else {
                return sum;
            }
        }
    }
    return closestTarget;
}


int main() {
    int nums[22] = {-4,-7,-2,2,5,-2,1,9,3,9,4,9,-9,-3,7,4,1,0,8,5,-7,-7};
    int closetTarget = threeSumClosest(nums, 22, 29);
    printf("%d\n", closetTarget);
}


你可能感兴趣的:(leetcode系列)