NC247. 最接近的三数之和
描述
示例1
输入:
[-1,2,1,-4],1
输出:
2
说明:
最接近 1 的三数之和是 -1+2+1 = 2示例2
输入:
[0,0,0],1
输出:
0
说明:
只有一种选择 0+0+0示例3
输入:
[0,1,0,0],0
输出:
0
C++ 解法, 执行用时: 3ms, 内存消耗: 388KB, 提交时间: 2022-07-31
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @param target int整型 * @return int整型 */ int ClosestSum(vector<int>& v, int t) { // write code here int n = v.size(); sort(v.begin(),v.end()); int res = v[0]+v[1]+v[2]; for(int i=0;i<n;i++) { int l=i+1,r=n-1; while(l<r) { int sum = v[i]+v[l]+v[r]; if(abs(sum-t) <abs(res-t)) res = sum; if(sum > t) r--; else if(sum <t) l++; else if(sum ==t) return sum; } } return res; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-07-10
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @param target int整型 * @return int整型 */ int ClosestSum(vector<int>& nums, int target) { // write code here int i, j, k, sum, min, arr = 1e4, n = nums.size(); sort(nums.begin(), nums.end()); for(k = 0; k < n; k++){ sum = target - nums[k]; i = k+1; j = n-1; while(i < j){ if(arr > abs(sum-nums[i]-nums[j])){ arr = abs(sum-nums[i]-nums[j]); min = nums[i] + nums[j] + nums[k]; } if(nums[i] + nums[j] == sum) break; else if(nums[i]+nums[j] < sum) i++; else if(nums[i]+nums[j] > sum) j--; } if(arr == 0) break; } return min; } };
C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-05-12
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @param target int整型 * @return int整型 */ int ClosestSum(vector<int>& nums, int target) { // write code here int n =nums.size(); sort(nums.begin(),nums.end()); int best = 1e7; for(int first = 0 ; first < n-2; first++){ if(first > 0 && nums[first] == nums[first-1]){ continue; } int second = first + 1,third = n - 1; while(second < third){ int sum = nums[first] + nums[second] + nums[third]; if(sum == target){ return target; } best = abs(target - sum) > abs(target - best) ? best : sum; if(sum > target){ int tmp = third - 1; while(second < tmp && nums[tmp] == nums[third]){ --third; } third = tmp; }else if(sum < target){ int tmp = second + 1; while(tmp < third && nums[tmp] == nums[second]){ ++tmp; } second = tmp; } } } return best; } };
C 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-02-11
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @param numsLen int nums数组长度 * @param target int整型 * @return int整型 * * C语言声明定义全局变量请加上static,防止重复定义 */ int cmp(const void *a, const void *b){ return *(int *)a-*(int*)b; } int ClosestSum(int* nums, int numsLen, int target ) { // write code here qsort(nums, numsLen, sizeof(int),cmp); int res=nums[0]+nums[1]+nums[2]; int sum=0,min=10001; int k; for(k=0;k<numsLen;k++){ int start=k+1,end=numsLen-1; while(start<end){ sum=nums[start]+nums[end]+nums[k]; if(abs(target-sum)<min){ min=abs(target-sum); res=sum; } if(sum>target) end--; else if(sum<target) start++; else return res; } } return res; }
C++ 解法, 执行用时: 3ms, 内存消耗: 400KB, 提交时间: 2022-05-16
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @param target int整型 * @return int整型 */ int ClosestSum(vector<int>& nums, int target) { sort(nums.begin(),nums.end()); int mem_diff=0x7fffffff; int mem_sum = 0x7fffffff; for(int k=0;k<nums.size();k++) { int i=k+1; int j=nums.size()-1; int target2= target - nums[k]; while(i<j) { int sum = nums[i]+nums[j]; int diff = target2-sum; if(target2<sum) { diff = -diff; j--; } else i++; if(diff<mem_diff) { mem_diff= diff; mem_sum = sum+nums[k]; } } } return mem_sum; } };