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

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

    我一拿到这题,就想着暴力破解,三重循环,i<j<k,这样也不用担心遍历重复了,但是这题还要考虑,给定的数组 nums 里元素重复。

    答案思路:双指针法,用双重循环,其中一层循环双指针,一个循环两个变量,时间复杂度就减少了。

      第一层固定元素k,第二层循环指针 i,j 

      k<i<j

    收获:

      1.本题学到了双指针法,一个指向头,一个指向尾,A情况头指针++,B情况尾指针--,C情况 头指针++ 尾指针--;

      2.学会了遍历List时候 去重的程序写法,看起来很舒服。

        i += 1

        while i < j and nums[i] == nums[i-1]: i += 1

        注: 是 i == i-1 不是 i == i+1 : 因为是判断现在与过去,不是现在与将来。

    class Solution:
        def threeSum(self, nums: List[int]) -> List[List[int]]:
            if len(nums) < 3:
                return None
            nums.sort()
            res = []
            k = 0
            while k < len(nums):
                if nums[k] > 0 :
                    break
                i,j = k+1,len(nums) - 1
                while i < j:
                    curVal = nums[k] + nums[i] + nums[j]
                    if curVal == 0:
                        res.append([nums[k],nums[i],nums[j]])
                        i = i + 1
                        j -= 1
                        while i<j and nums[i] == nums[i-1]: i += 1
                        while i<j and nums[j] == nums[j+1] : j -= 1
                    elif curVal < 0:
                        i += 1
                        while i<j and nums[i] == nums[i-1]:i+=1
                    elif curVal > 0:
                        j -= 1
                        while i <j and nums[j] == nums[j+1]: j-=1
                k+=1
                while k<len(nums) and nums[k] == nums[k-1]: k+=1
            return res


  • 相关阅读:
    UVA 1590 IP Networks
    UVA 12108
    HDUOJ 1042 N!
    UVA201 Squares
    UVaOJ 1339
    UVaOJ 202
    UVaOJ 100
    UVaOJ 10340
    第五章 跳跃表
    第四章 字典
  • 原文地址:https://www.cnblogs.com/ChevisZhang/p/12242597.html
Copyright © 2011-2022 走看看