[Leetcode][015] 3Sum (Java)
题目在这里: https://leetcode.com/problems/3sum/
【标签】 Array; Two Pointers
【个人分析】
老实交待,这个题卡半天,第一次做不会,抄别人的。过了很久,第二次做,还是不会……。好几次都是Time Limited Error。在看过正确答案之后,才知道是用的Two Pointers + sort 做的优化。
怎么优化? 简单说,就是通过 排序 + 跳过重复(利用Two Pointers) 来达到题目中避免 duplicates的要求。
核心思路: 我们给最终的由3个数组成的小数组叫 triplet。
1. 先锁定triplet中的第一个数字的index为 i (Line 12),
2. 然后我们希望从 [ nums[i + 1], nums[end]] 中找到两个数字,使得两个数字的和为 (0 - nums[i])
关键步骤:1. 在锁定第一个数字index的时候,跳过所有重复的数字 (Line 16处)。直到我们找到下一个不重复的数字作为triplet中的第一个数字
2. 在从[nums[i + 1], nums[end]]中找两个数字的时候,利用left pointer, right pointer。如果 left, right两个数的和比 twoSumTarget (Line 39)
小的话,只能通过将left pointer向右移动,来使得left + right的和更大一些,从而更接近twoSumTarget。
【一点心得】
在O(N^2)的算法中,考虑加入O(NlgN) 的排序操作。特别是遇到需要去除重复的时候,利用排序 + Two Pointers 来达到 HashSet的效果。
public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
int len = nums.length;
if (len < 3) {
return result;
}
Arrays.sort(nums);
// for all number that can be the 1st number of triplet
for (int i = 0; i < len - 1; i++) {
int firstNumber = nums[i];
// skip all duplicated first number
if (i == 0 || firstNumber != nums[i - 1]) {
int leftIndex = i + 1;
int rightIndex = len - 1;
int twoSumTarget = 0 - firstNumber;
// try to find two numbers that sum up to twoSumTarget
while (leftIndex < rightIndex) {
int twoSum = nums[leftIndex] + nums[rightIndex];
if (twoSum == twoSumTarget) {
// one valid triplet found!!
result.add(Arrays.asList(firstNumber, nums[leftIndex], nums[rightIndex]));
// skip duplicated nums[leftIndex]
while (leftIndex < rightIndex && nums[leftIndex] == nums[leftIndex + 1]) {
leftIndex++;
}
// skip duplicated nums[rightIndex]
while (leftIndex < rightIndex && nums[rightIndex] == nums[rightIndex - 1]) {
rightIndex--;
}
// move to next non-duplicates
leftIndex++;
rightIndex--;
} else if (twoSum < twoSumTarget) {
// move left towards right to
// make twoSum larger to get closer to twoSumTarget
leftIndex++;
} else {
rightIndex--;
}
}
}
}
return result;
}
}
[Leetcode][015] 3Sum (Java)的更多相关文章
- 【JAVA、C++】LeetCode 015 3Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- [Leetcode]015. 3Sum
public class Solution { public List<List<Integer>> threeSum(int[] num) { Arrays.sort(num ...
- [Leetcode][016] 3Sum Closest (Java)
题目: https://leetcode.com/problems/3sum-closest/ [标签]Array; Two Pointers [个人分析] 这道题和它的姊妹题 3Sum 非常类似, ...
- [LeetCode] 259. 3Sum Smaller 三数之和较小值
Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 < ...
- No.015 3Sum
15. 3Sum Total Accepted: 131800 Total Submissions: 675028 Difficulty: Medium Given an array S of n i ...
- 求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)
转自 http://tech-wonderland.net/blog/summary-of-ksum-problems.html 前言: 做过leetcode的人都知道, 里面有2sum, 3sum ...
- LeetCode 15 3Sum [sort] <c++>
LeetCode 15 3Sum [sort] <c++> 给出一个一维数组,找出其中所有和为零的三元组(元素集相同的视作同一个三元组)的集合. C++ 先自己写了一发,虽然过了,但跑了3 ...
- LeetCode--No.015 3Sum
15. 3Sum Total Accepted: 131800 Total Submissions: 675028 Difficulty: Medium Given an array S of n i ...
- LeetCode 16. 3Sum Closest(最接近的三数之和)
LeetCode 16. 3Sum Closest(最接近的三数之和)
随机推荐
- php stripslashes() addslashes() 解析
stripslashes() 函数删除由 addslashes() 函数添加的反斜杠. 实例: <?php $str = "Is your name O\'reilly?"; ...
- 关于latex的使用随笔
1.the context after paragraph topic to new line /paragraph{xxxx}~{} 2.关于表格中文本过长自动换行问题的解决 P.S.:直接贴一段写 ...
- 关于Cococs中的CCActionEase(下)
我们前面介绍的动作主要是用来改变内部动作的执行速度,接下来要介绍的这几个动作主要是用来增加表现效果的,可以看作是简单的特效. 10)CCEaseBackIn 1 void CCEaseBackIn:: ...
- echarts.制作中国地图,点击对应的省市链接到该省份的详细介绍
今天花了一天的时间,用echart弄了一个效果,是从中国地图点进去身份并把改省份的数据渲染出来的效果,刚开始完全没有头绪,只能硬着头皮去看百度echart的api,和博客,看了半天,好家伙,终于给我找 ...
- 04 - 替换vtkDataObject中的GetPipelineInformation 和GetExecutive 方法 VTK 6.0 迁移
VTK6 引入了许多不兼容的变.其中之一是删除vtkDataObject中所有有关管道的方法.其中的两个方法就是GetPipelineInformation() 和 GetExecutive().这些 ...
- xx通CGI流量控制
流量控制共分2步,首先在CGI框架对用户的ip作限制,第二限制每个CGI的流量. 一.基于IP的流量控制 用共享内存(shm)的方式保存基于ip的访问信息. 配置文件中 <variable ...
- 读取和导出下载 excel 2003,2007 资料
protected void Page_Load(object sender, EventArgs e) { //直接在bin add referece search Microsoft.Office ...
- win7 snmp
http://blog.chinaunix.net/uid-21857285-id-3340206.html
- Bundle类
1.新建一个Bundle类 Bundle bundle=new Bundle();2.Bundle类中放入数据(key-value的形式,另一个Activity里面取数据的时候,通过key值找出对应的 ...
- C51程序优化
1.指针: 对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高.但是在Keil中则相反,使用数组比使用的指针生成的代码更短.通常使用自加.自减指令和复合赋值表达式(如a-=1及a+=1 ...