leetcode 3sum

来源:互联网 发布:serge lang知乎 编辑:程序博客网 时间:2024/05/02 03:01
class Solution(object):    def threeSum(self, nums):        """        :type nums: List[int]        :rtype: List[List[int]]        """        results = []        target_pre = None        nums.sort()        for index_i in range(len(nums)-2):            sums = set()            j_pre = None            target = -nums[index_i]            if target == target_pre:                continue            else:                target_pre = target            for j in nums[index_i+1:]:                if j == j_pre:                    continue                if target-j in sums:                    if j < target-j:                        results.append([-target,j,target-j])                    else:                        results.append([-target,target-j,j])                    j_pre = j                else:                    sums.add(j)        return results

基于set的并不优雅的O(N*N*lgN)算法,

一个O(N*N)算法:

public List<List<Integer>> threeSum(int[] num)   {    ArrayList<List<Integer>> result = new ArrayList<List<Integer>>();           Arrays.sort(num);    for (int i=0; i < num.length; i++) {        int start = i + 1, end = num.length-1;        while (start < end) {//Two pointers            int sum = num[i] + num[start] + num[end];               if (sum == 0) {                     ArrayList<Integer> list = new ArrayList<Integer>();                list.add(num[i]);                list.add(num[start]);                list.add(num[end]);                    result.add(list);                start++;                end--;                while((start < end) && num[start] == num[start-1]) start++;     //remove duplicates                while((start < end) && num[end] == num[end+1]) end--;            }            else if (sum < 0) {                start++;                       while((start < end) && num[start] == num[start-1]) start++;     //remove duplicates            } else {                            end--;                while((start < end) && num[end] == num[end+1]) end--;           //remove duplicates                         }              }        while (i+1 < num.length && num[i+1] == num[i])                          //remove duplicates            i++;                }    return result;}


0 0
原创粉丝点击