LeetCode16: 最接近的三数之和

问题:

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

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与target最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析

本题主要是利用双指针,与快速排序比较类似
1、首先对给定数组进行排序
2、从第一个(最小)的数字开始进行,设置两个指针,小指针在当前第一个数的右边一个,大指针在数组最大方向
3、对当前数字与预期数字进行比较,如果小于预期则小指针向前,使结果变大,反之则大指针向后
4、
在这里插入图片描述引用:https://leetcode-cn.com/problems/3sum-closest/solution/hua-jie-suan-fa-16-zui-jie-jin-de-san-shu-zhi-he-b/
画解算法

代码

 public int threeSumClosest(int[] nums, int target) {
	 Arrays.sort(nums);
	 int ans = nums[0]+nums[1]+nums[2];//直接将ans设置成内部可能的一个值,免去了可能会数较大的麻烦
	 int sum = 0;
	 int now = 0;
	 if(nums.length==0||nums==null)
	 {
		 return 0;
	 }
	 for(int i=0;i<nums.length;i++)
	 {
		 int j=i+1;
		 int k=nums.length-1;
		 while(j<k)
		 {
			 sum = nums[i]+nums[j]+nums[k];
			 if(Math.abs(sum-target)<Math.abs(ans-target))
			 {
				 ans = sum;
			 }else if(sum>target)//将sum与target直接比较,比较明智的方法,不用先算出来在进行判断,比target大就往小的方向走,小就往大的方向走
			 {
				 k--;
			 }else {
				 j++;
			 }
			 
		 }
	 }
	 return ans;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值