您的位置:首页 > 编程语言 > PHP开发

FTPrep, 15 3Sum

2017-07-14 14:22 274 查看
老题了,基本思路就那样。。但还是有点虚,主要是细节上的处理还是不是特别清楚,还需要多练。。

思路:

1,以2Sum为基础,作为一个helper function来用。特别注意,当在==时,需要更新list,因为不能有duplicates,所以在==时的index更新要判断相邻index所对应的值,直到有一个不想等的值。

2,有了2Sum helper function 作为基础,剩下就是从0 -> len-3 这个范围的遍历,同样的如果跟之前index所指的值相等,则continue,pass 这个循环中剩下的部分。

3,关于ArrayList<T>{Arrays.asList(a, b, c)}的一些初始化,和 .get(i) //相当于 按照index取值 array[i], 等方法的熟练。

代码如下,复杂度是N平方。

public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> threeNum = new ArrayList<>();
int len = nums.length;
if(len<=2) return threeNum;
Arrays.sort(nums);
for(int i=0; i<len-2; i++){
if(i>0 && nums[i]==nums[i-1]) continue;
List<List<Integer>> twoNumList = twoSum(nums, i+1, len-1, -nums[i]);
for(int j=0; j<twoNumList.size(); ++j)  twoNumList.get(j).add(nums[i]);
threeNum.addAll(twoNumList);
}
return threeNum;
}

private List<List<Integer>> twoSum(int[] nums, int left, int right, int target){
List<List<Integer>> twoNum = new ArrayList<>();
while(left<right){
int sum =nums[left]+nums[right];
if(sum ==target){
twoNum.add(new ArrayList<Integer>(Arrays.asList(nums[left], nums[right])));
left++;
right--;
while(left<right&&nums[left]==nums[left-1]) left++;
while(left<right&&nums[right]==nums[right+1]) right--;
}
else if(sum<target) left++;
else right--;
}
return twoNum;
}
}

 关于以上代码的结构,pattern和记忆在4Sum里总结了,点击打开链接

结构应该是:

for( i: 0 -> len-3){
*
for ( j: i+1-> len-1){
**
} // generating 2Sum result, 这个for loop就用 helper function 取代。
// 写成: 2SumList= helper( nums, i, ...);

for (2-tuple : 2SumList ) {
finalList.add.(2-tuple.add(nums[i]))
}

}

以上的抽象结构看得很清楚:第一层for loop里面,包含了2个 第二层 for loop,姑且说第一层是大loop,第二层的小loop,第一个小loop其实是简化成了helper function,因为大部分代码复用了,只有几个参数不同;第二个小loop就是把helper function 形成的结果,都加上nums[i],添加到最终结果。有了这个结构之后,再加上两个关于 不包括 duplicate 的处理就可以了,在 ** 处。

* 这个地方要加continue的判断条件,但i的移动前后所指的数相同的话,就skip掉后面的code**

** 在2Sum过程中,如果==,那就添加item,同时要记得做 移动后相邻两个数相等是 要进行 skip,通过while()来实现**
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: