zoukankan      html  css  js  c++  java
  • 15.三数之和

    15. 三数之和

    难度中等1904收藏分享切换为英文关注反馈

    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

    注意:答案中不可以包含重复的三元组。

    示例:

    给定数组 nums = [-1, 0, 1, 2, -1, -4],
    
    满足要求的三元组集合为:
    [
      [-1, 0, 1],
      [-1, -1, 2]
    ]
    
    #暴力法
    def threeSum(nums):
        results = []
        if not nums:
            return None
        from collections import Counter
        vocab = Counter(nums)
        for i in range(len(nums)):
            vocab = Counter(nums)
            for j in range(i):
                vocab[nums[i]] -= 1
                vocab[nums[j]] -= 1
                
                if -(nums[i]+nums[j]) in vocab and vocab[-(nums[i]+nums[j])]>0:
                    results.append([nums[i],nums[j],-nums[i]-nums[j]])
        return results
    
    #排序,双指针
    def threeSum(nums):
        results = []
        if not nums or len(nums)<3:
            return []
        
        nums.sort()
        for i in range(n):
            if(nums[i]>0):#数组已经排序,大于0之后不会有三数和为0
                return results
            if(i>0 and nums[i]==nums[i-1]):#去重,i-1位置符合要求的数组已经统计过,i位置和i-1数值相等,得到的结果也是重复
                continue
            L=i+1
            R=n-1
            while(L<R):
                if(nums[i]+nums[L]+nums[R]==0):
                    result.append([nums[i],nums[L],nums[R]])
                    while(L<R and nums[L]==nums[L+1]):#去重,i已经指定,如果L和L+1位置相等,那R位置肯定也相等,得到的结果就会重复
                        L=L+1
                    while(L<R and nums[R]==nums[R-1]):#去重,同上
                        R=R-1
                    L=L+1
                    R=R-1
                elif(nums[i]+nums[L]+nums[R]>0):
                    R=R-1
                else:
                    L=L+1
        return res
    
  • 相关阅读:
    (转)Too many open files
    Python小程序扫描清理Redis中的key
    spring-mvc接口返回json格式数据Long类型字段精度失真
    项目基础配置
    搭建Vue脚手架(vue-cli)并创建一个项目
    项目简介
    [技术学习]HTTP 常见状态码
    git 使用beyond compare 记录
    温故知新之架构图
    学年教学总结
  • 原文地址:https://www.cnblogs.com/gongyanzh/p/12518305.html
Copyright © 2011-2022 走看看