[LeetCode] 3Sum的O(N^2)解法

来源:互联网 发布:《大数据思维与决策》 编辑:程序博客网 时间:2024/05/28 23:10

问题如下:
3Sum Problem in LeetCode

代码如下:

public List<List<Integer>> threeSum(int[] nums) {        List<List<Integer>> ll = new LinkedList<List<Integer>>();        if(nums.length<3) return ll;        Arrays.sort(nums);        for(int i=0;i<nums.length-2;i++){            if(i==0 || (i>0 && nums[i]!=nums[i-1])){                int left = i+1, right = nums.length-1, sum = 0 - nums[i];                while(left<right){                    if(nums[left]+nums[right] == sum) {                        ll.add(Arrays.asList(nums[left],nums[right],nums[i]));                        //考虑重复的情况                        while(left<right && nums[left] == nums[left+1]) left++;                        while(left<right && nums[right] == nums[right-1]) right--;                        left++;right--;                    }                    else if (nums[left]+nums[right] > sum) right--;                    else left++;                }            }        }        return ll;    }

这题的思路是利用公式 a+b+c=0 –>c = 0-b-c;
思路源自于算法(第四版)的2Sum方法。借鉴于Leetcode的Discussion。

由于是有序排列的,可以依据快速排序的思路,根据结果控制左加或者右减,感觉了解快排原理的童鞋都应该能看懂

原创粉丝点击