codetop打卡第三日

133 阅读2分钟

🍊今天来打卡codetop第三天,今天主要是来2数之和与3数之和的问题,大多数同学可能接触leetcode题最开始接触的就是2数之和,用暴力解法解出来之后异常开心。今天就让我们来重温这种快乐🍊\color{#fbbc05}{今天来打卡codetop第三天,今天主要是来2数之和与3数之和的问题,大多数同学可能接触leetcode题最开始接触的就是2数之和,用暴力解法解出来之后异常开心。今天就让我们来重温这种快乐}

🐥话不多说,让我们开始今天的学习。🐥\color{#4285f4}{话不多说,让我们开始今天的学习。}

1.题目描述

leetcode1:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。

image.png

解题思路:很多同学第一次解决这道题直接采用暴力解法,确实可以解决出来,但这里我们采用更快捷的哈希表的方式。

def twoSum(self, nums: List[int], target: int) -> List[int]:

    hashtab={}#构建一个hash表

    for i,j in enumerate(nums):#enumerate可以返回数组的下标和值

        if target-j in hashtab:#判断target-j的目标值是否在hash表里

            return [hashtab[target-j],i] #在的话直接返回

        else:

            hashtab[j]=i #不在的话添加到里面。

运行结果:

image.png

两数之和很简单,我们接着拓展到三数之和

2. 拓展

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。

image.png

def threeSum(self, nums: List[int]) -> List[List[int]]:

    nums.sort()#首先排序

    n=len(nums)#计算数组长度

    res=[]#初始话结果

    for i in range(len(nums)):#选择第一个元素

        left=i+1#设置为左指针为i+1个元素

        right=n-1#设置右指针为最右边的元素

        if i>0 and nums[i]==nums[i-1]:#判断左指针的元素和旁边一个是否相等,相等的话就跳过

                continue

        while left<right:#寻找三数之和为目标值的元素

            if nums[left]+nums[right]<-nums[i]:

                left+=1

            elif nums[left]+nums[right]>-nums[i]:

                right-=1

            else:

                res.append([nums[i],nums[left],nums[right]])#找到后加入res

                while left<right and nums[left]==nums[left+1]:#如果结果中的left和left+1相等,则left再往下一位

                    left+=1

                left+=1

                right-=1

         return res#返回结果

运行结果:

image.png

三数之和用的思想是用2个数来确定第三个数,这样子避免了暴力搜索达到的O(N^3)的复杂度,这里的复杂度是O(N^2)