• leetcode15


    class Solution {
        public List<List<Integer>> threeSum(int[] nums) {
            Arrays.sort(nums);
            List<List<Integer>> ls = new LinkedList<>();
     
            for (int i = 0; i < nums.length - 2; i++) {
                if (i == 0 || (i > 0 && nums[i] != nums[i - 1])) {  // 跳过可能重复的答案
     
                    int l = i + 1, r = nums.length - 1, sum = 0 - nums[i];
                    while (l < r) {
                        if (nums[l] + nums[r] == sum) {
                            ls.add(Arrays.asList(nums[i], nums[l], nums[r]));
                            while (l < r && nums[l] == nums[l + 1]) l++;
                            while (l < r && nums[r] == nums[r - 1]) r--;
                            l++;
                            r--;
                        } else if (nums[l] + nums[r] < sum) {
                            while (l < r && nums[l] == nums[l + 1]) l++;   // 跳过重复值
                            l++;
                        } else {
                            while (l < r && nums[r] == nums[r - 1]) r--;
                            r--;
                        }
                    }
                }
            }
            return ls;
        }
    }

    使用python实现:

     1 class Solution:
     2     def threeSum(self, nums: 'List[int]') -> 'List[List[int]]':
     3         nums = sorted(nums)
     4         res = []
     5         n = len(nums)
     6         for i in range(n-2):
     7             if i == 0 or nums[i] != nums[i-1]:
     8                 l,r,sums = i + 1,n-1,0-nums[i]
     9                 while l < r:
    10                     if nums[l] + nums[r] == sums:
    11                         res.append([nums[i],nums[l],nums[r]])
    12                         while l < r and nums[l] == nums[l+1]:
    13                             l += 1
    14                         while l < r and nums[r] == nums[r-1]:
    15                             r -= 1
    16                         l += 1
    17                         r -= 1
    18                     elif nums[l] + nums[r] < sums:
    19                         while l < r and nums[l] == nums[l+1]:
    20                             l += 1
    21                         l += 1
    22                     else:
    23                         while l < r and nums[r] == nums[r-1]:
    24                             r -= 1
    25                         r -= 1
    26         return res

    下面补充另一种思路,使用python实现,是根据leetcode167 twonum II的思路来做的,效率比上面的方法要高一些,代码如下:

     1 class Solution:
     2     def towSum(self,numbers,target):
     3         i = 0
     4         j = len(numbers) - 1
     5 
     6         ary = list()
     7         while i < j:
     8             sums = numbers[i] + numbers[j]
     9             #print(str(i)+','+str(j)+'->'+str(sums))
    10             if sums == target:
    11                 #return numbers[i],numbers[j]
    12                 ary.append([numbers[i],numbers[j]])
    13                 while i < j and numbers[i]==numbers[i+1]:
    14                     i+=1
    15                 i+=1
    16             elif sums < target:
    17                 i+=1
    18             else:
    19                 j-=1
    20         return ary
    21 
    22     def threeSum(self, nums: 'List[int]') -> 'List[List[int]]':
    23         result = list()
    24         
    25         sortedlist = sorted(nums)
    26 
    27         zlist = list(filter(lambda x:x==0,sortedlist))
    28         if len(zlist) >= 3:
    29             result.append([0,0,0])
    30 
    31         nlist = list(filter(lambda x:x<0,sortedlist))
    32         nset = set(nlist)
    33 
    34         plist = list(filter(lambda x:x>=0,sortedlist))
    35         pset = set(plist)
    36         for target in nset:
    37             aa = self.towSum(plist,target*-1)
    38             for a in aa:
    39                 a1 = a[0]
    40                 a2 = a[1]
    41                 clist = [a1,a2,target]
    42                 result.append(clist)
    43                     
    44 
    45         for target in pset:
    46             aa = self.towSum(nlist,target*-1)
    47             for a in aa:
    48                 a1 = a[0]
    49                 a2 = a[1]
    50                 clist = [a1,a2,target]
    51                 result.append(clist)
    52         
    53         return result
  • 相关阅读:
    HDOJ2066 一个人的旅行 floyd
    手动添加数据源时DataGridViewComboBoxCell值出问题解决方法
    可伸缩的Form窗体!
    SharpMap项目Web控件学习!
    MVC和MVP的初步理解
    ArcEngine编辑功能(五)
    胡言乱语:实体具有继承关系的空间数据库设计方法?
    WinForm单例窗体的实现
    4. 模板模式和建造者模式
    Oracle笔记(0):在Win2008系统上安装Oracle11g实践
  • 原文地址:https://www.cnblogs.com/asenyang/p/9791008.html
Copyright © 2020-2023  润新知