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 }

 

posted on 2023-03-10 15:25  _月生  阅读(25)  评论(0)    收藏  举报