【leetcode】16_最接近的三數之和
阿新 • • 發佈:2020-07-14
連結
[https://leetcode-cn.com/problems/3sum-closest/]
難度中等
描述
給定一個包括 n 個整數的陣列 nums
和 一個目標值 target
。找出 nums
中的三個整數,使得它們的和與 target
最接近。返回這三個數的和。假定每組輸入只存在唯一答案
示例
輸入:nums = [-1,2,1,-4], target = 1
輸出:2
解釋:與 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
AC程式碼
//暴力法 class Solution { public: int threeSumClosest(vector<int>& nums, int target) { int mindis,ans; mindis=abs(nums[0]+nums[1]+nums[2]-target); ans=nums[0]+nums[1]+nums[2]; for(int i=0;i<nums.size()-1;i++){ for(int k=i+1;k<nums.size()-1;k++){ for(int j=nums.size()-1;j>k;j--){ if(abs(nums[i]+nums[j]+nums[k]-target)<mindis){ ans=nums[i]+nums[j]+nums[k]; mindis=abs(ans-target); } } } } return ans; } };
//雙指標 class Solution { public: int threeSumClosest(vector<int> &nums, int target) { sort(nums.begin(), nums.end()); //排序 int min = nums[0] + nums[1] + nums[2]; //最小值初始化,方便比較 for (int i = 0; i < nums.size() - 2; i++) { int left = i + 1; int right = nums.size() - 1; while (left < right) { int sum = nums[i] + nums[left] + nums[right]; if (abs(sum - target) < abs(min - target) min = sum; //記錄最小值 if (sum == target) //兩數相等時最接近,直接返回target return target; else if (sum < target) //sum變大才能更接近target,left右移 left++; else //right左移 right--; } } return min; } };