leetcode 16. 最接近的三数之和

给定一个包括n个整数的数组nums和一个目标值target。找出nums中的三个整数,使得它们的和与target最接近。返回这三个数的和。假定每组输入只存在唯一答案。

 

题解:

1.一个整数数组nums和目标值target

2.找出三个整数,和与target最接近

3.返回这个和,答案唯一

4.nums长度最小为3,这三个数不要求连续

 

示例:

输入:nums = [-1,2,1,-4], target = 1

输出:2

解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

提示:

3 <= nums.length <= 10^3

-10^3 <= nums[i] <= 10^3

-10^4 <= target <= 10^4

 

解题思路:

  • 思路与15. 三数之和一样在找数的过程,都是在找三个数字

  • 因为数组无序,先进行排序方便找三个数比较

  • 如果原本数组长度为3,直接返回这三个数的和

  • 数组排序后,记录前三个数的和为基准

  • 下标从1开始,确定三数中的一个数

  • 把数组中剩余的数看做一个从小到大排列的整体,设置前后指针并从两端往里取数,这里与15. 三数之和取数过程一样,比较基准与新三数和与target的距离,新三数和更近的话更新基准

  • 如果值大于target,则右指针往左移动,降低和

  • 值小于target,左指针往右移动,增大和

  • 等于target,则为结果答案

C/C++题解:

class Solution {

public:

    int threeSumClosest(vector<int>& nums, int target) {

        sort(nums.begin(), nums.end());//对整个数组排序

        //数组长度大于等于3,等于3时直接返回

        int res = nums[0] + nums[1] + nums[2];

        if(nums.size() == 3) return res;

        for(int i=0;i<nums.size();i++) {//前后双指针

            int start = i+1, end = nums.size() - 1;

            while(start < end) {//与三数之和一样,选定一个i在剩余部分两端试数字

                int sum = nums[start] + nums[end] + nums[i];

                if(abs(target - sum) < abs(target - res))

                    res = sum; //如果新的三数更接近target,结果为sum

                if(sum > target)//因为是从小到大排序

                    end -= 1;//新和大于target则右边数选的大,后指针往前走

                else if(sum < target)

                    start += 1;//相反,小于就左指针往后走

                else //等于则差0,直接是答案

                    return res;}}

        return res;}};

Debug结果:

leetcode 16. 最接近的三数之和

Java题解:

class Solution {

    public int threeSumClosest(int[] nums, int target) {

        Arrays.sort(nums);//对整个数组排序

        //数组长度大于等于3,等于3时直接返回

        int res = nums[0] + nums[1] + nums[2];

        if(nums.length == 3) return res;

        for(int i=0;i<nums.length;i++) {//前后双指针

            int start = i+1, end = nums.length - 1;

            while(start < end) {//与三数之和一样,选定一个i在剩余部分两端试数字

                int sum = nums[start] + nums[end] + nums[i];

                if(Math.abs(target - sum) < Math.abs(target - res))

                    res = sum; //如果新的三数更接近target,结果为sum

                if(sum > target)//因为是从小到大排序

                    end -= 1;//新和大于target则右边数选的大,后指针往前走

                else if(sum < target)

                    start += 1;//相反,小于就左指针往后走

                else //等于则差0,直接是答案

                    return res;}}

        return res;}}

Debug结果:

leetcode 16. 最接近的三数之和

Python题解:

class Solution(object):

    def threeSumClosest(self, nums, target):

        """:type nums: List[int]:type target: int:rtype: int"""

        nums.sort() #对整个数组排序

        #数组长度大于等于3,等于3时直接返回

        res = nums[0] + nums[1] + nums[2]

        if len(nums) == 3: return res

        for i in range(len(nums)):#前后双指针

            start, end = i+1, len(nums) - 1

            while start < end: #与三数之和一样,选定一个i在剩余部分两端试数字

                sumVal = nums[start] + nums[end] + nums[i]

                if abs(target - sumVal) < abs(target - res):

                    res = sumVal #如果新的三数更接近target,结果为sum

                if sumVal > target: #因为是从小到大排序

                    end -= 1 #新和大于target则右边数选的大,后指针往前走

                elif sumVal < target:

                    start += 1 #相反,小于就左指针往后走

                else: #等于则差0,直接是答案

                    return res

        return res

Debug结果:

leetcode 16. 最接近的三数之和

更多题解移步公众号免费获取

leetcode 16. 最接近的三数之和