16 3sum closest
来源:互联网 发布:大连淘宝运营 编辑:程序博客网 时间:2024/05/21 09:44
思路应该和3sum一样,只是判断的条件不同,这里要求是最接近的,那么就需要维护一个变量,然后通过Math.abs()的大小来判断。。。
下面的代码超时了,看这次能不能写好点:
public class Solution { public int threeSumClosest(int[] nums, int target) { //无效输入 if(nums==null || nums.length<3) return Integer.MAX_VALUE; //两端的极端特例 Arrays.sort(nums); int minNums=nums[0]+nums[1]+nums[2]; int maxNums=nums[nums.length-3]+nums[nums.length-2]+nums[nums.length-1]; if(target>maxNums) return maxNums; else if (target<minNums) return minNums; //正常情况 else{ int result=nums[1]+nums[2]+nums[nums.length-1]; for(int i=0; i<nums.length-2; i++){ int left=i+1; int right=nums.length-1; int sum=nums[i]+nums[left]+nums[right]; //update result because of update of i: i++ if(sum==target) return target; else result = Math.abs(sum-target)<Math.abs(result-target)?sum:result; // 根据另一个标准 来 二选一; while(left<right){ sum=nums[i]+nums[left]+nums[right]; result = Math.abs(sum-target)<Math.abs(result-target)?sum:result; if(sum==target) return target; else if(sum>target){ right--; } else if(sum<target){ left++; } } } return result; } }}
今天写的代码,思路清楚多了,代码也比较简练:
public class Solution { public int threeSumClosest(int[] nums, int target) { Arrays.sort(nums); int len=nums.length; if(nums[0]+nums[1]+nums[2]>=target) return nums[0]+nums[1]+nums[2]; if(nums[len-1]+nums[len-2]+nums[len-3]<=target) return nums[len-1]+nums[len-2]+nums[len-3]; // 以上的两个判断,可以节约不少时间,从25%到55%,没有上面的判断也work,还是写得不错的,就是在3sum的基础上发生出来的。。 int closest=0; int diff=Integer.MAX_VALUE; // 返回值和判断条件是不同的,所以通过closest和diff两个变量来是维护 for(int i=0; i<len-2; i++){ int left=i+1; int right=len-1; while(left<right){ int sum = nums[i]+nums[left]+nums[right]; if(sum==target) return sum; else if(sum<target){ closest=(target-sum)<diff?sum:closest; diff=(target-sum)<diff?(target-sum):diff; // diff也要更新,这里其实写成一个if((target-sum)<diff){...}也许更清楚 left++; // 上面两个更新是这道题必须的,这个条件就是根据3sum的基本思路来的,反应了两个极端情况判断的必要性 } else if(sum>target){ closest=(sum-target)<diff?sum:closest; // 同上 diff=(sum-target)<diff?(sum-target):diff; right--; } } } return closest; }}
0 0
- #16 3Sum Closest
- 16 3Sum Closest
- #16 3Sum Closest
- 16 3Sum Closest
- 16 3Sum Closest
- 16 3Sum Closest
- 16 3Sum Closest
- 16 - 3Sum Closest
- 【16】3Sum Closest
- 16 3sum closest
- LeetCode 16: 3Sum Closest
- LeetCode 16: 3Sum Closest
- leetcode 16 3Sum Closest
- [leetcode 16] 3Sum Closest
- Leetcode【16】:3Sum Closest
- [leetcode 16] 3Sum Closest
- [Leetcode] 16 - 3Sum Closest
- leetcode.16----------3Sum Closest
- 【Unity编程】官方资源介绍
- 在Windows上和Linux上安装xdebug
- maven不能设置为web3.0
- "=="和equals
- 【Unity编程】 Unity界面概览
- 16 3sum closest
- Windows安装TensorFlow
- CentOS 7安装与配置JDK8
- 解决winfrom下TextBox不支持透明背景色
- CRC32 和 zip文件的crc 字段
- 监督学习-支持向量机模板
- [LeetCode] 417. Pacific Atlantic Water Flow 解题报告
- C语言const与指针
- '\n' 与'\r'