FTPrep, 15 3Sum

老题了,基本思路就那样。。但还是有点虚,主要是细节上的处理还是不是特别清楚,还需要多练。。

思路:

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()来实现**



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值