LeetCode16 最接近的三数之和
- 题目描述
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
链接:https://leetcode.cn/problems/3sum-closest
- 示例
输入: nums = [-1,2,1,-4], target = 1
输出: 2
解释: 与 target 最接近的和是 2 (-1 + 2 + 1 = 2) .
- 算法思想
首先对输入的数据进行排序,然后固定一个数作为第一个要相加的数,并在其余的数的区间采用双指针法,得到三个数之后,判断三数之和是否比上次更邻近target,若更接近更新相应的数据.
- 代码
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int main() { 5 int n; 6 cin >> n; 7 int* a = new int[n]; 8 for (int i = 0; i < n; i++) 9 cin >> a[i]; 10 int target; 11 cin >> target; 12 sort(a, a + n);//默认升序排序 13 int dis = INT_MAX;//初始值为最大值 14 int sum = 0; 15 int res = 0; 16 for (int i = 0; i <= n - 3; i++) { 17 //双指针法 18 int l = i + 1, r = n - 1; 19 while (l < r) { 20 sum = a[i] + a[l] + a[r]; 21 int x = abs(sum - target); 22 if (x< dis) {//间距比上次更小,更新dis,res 23 dis = x; 24 res = sum; 25 } 26 if (sum > target) r--; //三数之和大于目标值,r--,因为右方的数较大 27 else if (sum < target) l++; //三数之和小于目标值,l++,因为左方的数较小 28 else { //三数之和等于目标值,直接输出目标值 29 cout <<target << endl; 30 return 0; 31 } 32 } 33 } 34 cout << res << endl;//输出最接近target的数 35 return 0; 36 }
浙公网安备 33010602011771号