LeetCode第[16]题(Java):3Sum Closest 标签:Array
题目难度:Medium
题目:
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers.
You may assume that each input would have exactly one solution.
翻译:
给定一个n个整数的数组S,在S中找到三个整数,使三个数的和最接近目标数,返回三个整数的和。
您可以假设每个输入都有一个确定的答案。
思路:利用3sum里面的算法进行适当调整进行定位。
Code:125 / 125 test cases passed.——27ms(beats 20.85%) 时间复杂度:O(N2)
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int result = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.length - 2; i++) {
if (i > 0 && nums[i] == nums[i-1])
continue; // 相邻起点相同的情况已经在上一个点都判断过了
int left = i + 1;
int right = nums.length - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right]; // 与3sumy一样
if (Math.abs(sum - target) < Math.abs(result - target)) {
result = sum;
}
// 找3sum时,是找确切的相等,所以找到后,三点的值就确定了,不可能有另一个不同的值可以对其中某一个进行替代(只能同时替换两个);
// 但是本题就算找到了也不能去重,因为三点不是确定的,有可能用一个点将三点中某一点进行替代形成更接近的数,所以不能用while去重【其实要去也行,需要加一个绝对值判断,见下面解释】
if (sum > target) {
right--;
} else {
left++;
}
}
}
return result;
}
不去重解释:
如果去重,假如num[left]与num[left+1]相同,消除了num[i]+num[left]+num[left+1]是‘’最接近的组合‘’可能
其实要去也不是没有办法,那就把这个可能在去重前进行判断记录即可:
if (left < right
&& nums[left] == nums[left + 1]
&& Math.abs(target - sum) < Math
.abs(target - result)) {
result = nums[i] + nums[left] * 2;
}
if (left < right
&& nums[right] == nums[right - 1]
&& Math.abs(target - sum) < Math
.abs(target - result)) {
result = nums[i] + nums[right] * 2;
}
明显,这种方法仅仅为了那一种情况增加算法复杂度是不明智的,在运行其他测试用例的时候都会慢一点,所以不采用。
参考答案:125 / 125 test cases passed.——26ms(beats 20.85%) 时间复杂度O(N2)
public int threeSumClosest(int[] num, int target) {
int result = num[0] + num[1] + num[num.length - 1];
Arrays.sort(num);
for (int i = 0; i < num.length - 2; i++) {
int start = i + 1, end = num.length - 1;
while (start < end) {
int sum = num[i] + num[start] + num[end];
if (sum > target) {
end--;
} else {
start++;
}
if (Math.abs(sum - target) < Math.abs(result - target)) {
result = sum;
}
}
}
return result;
}
和我的简直一毛一样
啊哈哈哈哈哈!

没想到,仅仅刷题几天,我已经如此强大了!简直百年难得的刷题奇才呀!
实验室路人甲:明明答案更快点。
朕:切,1ms能叫快嘛,我重新submit一下说不定还20ms了,略
实验室路人甲:那你看人家把nums[i]包括进sum了是不是比你少算几次?
朕:




好吧,确实应该把nums[i]包括进去。。。sum在此算法里应该灵活使用,即需要整体值时使用。
在讨论区还有大神将此题答案优化了一下(去重),好吧肯定不是我的去重那么复杂。。。。
Code:125 / 125 test cases passed.——22ms(beats 62.99%) 时间复杂度O(N2)
public int threeSumClosest3(int[] nums, int target) {
Arrays.sort(nums);
int sum = nums[0] + nums[1] + nums[nums.length - 1];
int closestSum = sum;
for(int i = 0; i < nums.length - 2; i++){
if(i==0 || nums[i]!=nums[i-1]){
int left = i + 1, right = nums.length - 1;
while(left < right){
sum = nums[left] + nums[right] + nums[i];
if(sum < target){
//move closer to target sum.已经确定sum比target小了,那么相同的left肯定也是小的
while(left<right && nums[left] == nums[left+1]){
left++;
}
left++;
}else if(sum > target){
//move closer to target sum.
while(left<right && nums[right] == nums[right-1]){
right--;
}
right--;
}else{
return sum;
}
//update the closest sum if needed.
if(Math.abs(target - sum) < Math.abs(target - closestSum)){
closestSum = sum;
}
}
}
}
return closestSum;
}
原来发现在【28行】找到更小值时不能进行去重,可以选择在【11-25行】指针调整的判断里面进行,并且增加了直接返回最优解,厉害厉害

LeetCode第[16]题(Java):3Sum Closest 标签:Array的更多相关文章
- LeetCode第[18]题(Java):4Sum 标签:Array
题目难度:Medium 题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + ...
- LeetCode第[16]题(Java):3Sum Closest (和目标值最接近的三个数的和)——Medium
题目难度:Medium 题目: Given an array S of n integers, find three integers in S such that the sum is closes ...
- 【LeetCode每天一题】3Sum Closest(最接近的三数和)
Given an array nums of n integers and an integer target, find three integers in nums such that the s ...
- LeetCode第[88]题(Java):Merge Sorted Array(合并已排序数组)
题目:合并已排序数组 难度:Easy 题目内容: Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as ...
- LeetCode第[1]题(Java):Two Sum 标签:Array
题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...
- LeetCode第[1]题(Java):Two Sum (俩数和为目标数的下标)——EASY
题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...
- LeetCode第[46]题(Java):Permutations(求所有全排列) 含扩展——第[47]题Permutations 2
题目:求所有全排列 难度:Medium 题目内容: Given a collection of distinct integers, return all possible permutations. ...
- leetcode第16题--3Sum Closest
Problem:Given an array S of n integers, find three integers in S such that the sum is closest to a g ...
- LeetCode第[15]题(Java):3Sum 标签:Array
题目难度:Medium 题目: Given an array S of n integers, are there elements a, b, c in S such that a + b + c ...
随机推荐
- poj - 1185 炮兵阵地 状压DP 解题报告
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21553 Accepted: 8363 Description ...
- 漂亮CSS样式用户留言表单
基本样式 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- 《RabbitMQ Tutorial》译文 第 6 章 远程过程调用(RPC)
原文来自 RabbitMQ 英文官网的教程(6.Remote procedure call - RPC),其示例代码采用了 .NET C# 语言. In the second tutorial we ...
- Pseudo-devices On GNU/Linux
先分享一则有意思Q&A,来自The FreeBSD Funnies 17.4 . Where does data written to* /dev/null* go? It goes in ...
- C#:将.csv格式文件转换成.xlsx格式文件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- web前端学习就这9个阶段,你属于哪个阶段?
第一阶段:HTML+CSS: HTML进阶.CSS进阶.div+css布局.HTML+css整站开发. JavaScript基础:Js基础教程.js内置对象常用方法.常见DOM树操作大全.ECMAsc ...
- 写给自己的web总结——关于html的知识总结
相信每个前端工程师初识前端之时,最先接触的都是html吧! html的全称是hyperText markup language, 超文本标记语言,在网页中所有的文字,图片,架构等都是由html来编写的 ...
- Xamarin android如何反编译apk文件
Xamarin android 如何反编译 apk文件 这里推荐一款XamarinAndroid开发的小游戏,撸棍英雄,游戏很简单,的确的是有点大.等一下我们来翻翻译这个Xamarin Android ...
- bzoj 1570: [JSOI2008]Blue Mary的旅行
Description 在一段时间之后,网络公司终于有了一定的知名度,也开始收到一些订单,其中最大的一宗来自B市.Blue Mary决定亲自去签下这份订单.为了节省旅行经费,他的某个金融顾问建议只购买 ...
- bzoj 5016: [Snoi2017]一个简单的询问
Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计算区间[l,r]中,数字x出现了多少次. Input 第 ...