LeetCode实战 -- Task05.最接近的三数之和

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

示例:

例如,给定数组 nums = [-121-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

算法:
先对数组进行排序,然后遍历一次数组,找出target对应数组所在的位置,定义left和right作为target的左右两个指针,比较left与right分别和target的差值,选取较小的那一个作为结果加在result上,对应的指针向左边或右边移动,循环比较,得到最终的结果。

时间复杂度: O ( n 2 ) O(n^2)
空间复杂度: O ( n ) O(n)

代码:

class Solution 
{
	public:
  	int threeSumClosest(vector<int>& nums, int target) 
	{
		sort(nums.begin(), nums.end());
		if(nums.size()<3) return 0;
		int ans = nums[0] + nums[1] + nums[2];
		for (int i = 0; i < nums.size(); i++)
		{
			int left = i + 1, right = nums.size() - 1;
			while (left < right)
			{
				int sum = nums[left] + nums[right] + nums[i];
				if (abs(target - sum) < abs(target - ans)) ans = sum;
				if (sum > target) right--;
				else if (sum < target) left++;
				else return ans;
			}
		}
		return ans;
	}
};

执行结果:
在这里插入图片描述
在这里插入图片描述

发布了95 篇原创文章 · 获赞 28 · 访问量 2406

猜你喜欢

转载自blog.csdn.net/qq_42093469/article/details/104673396
今日推荐