相向双指针

双指针一头一尾,向中间靠拢直到相遇,时间复杂度O(n)

1. 两数之和https://leetcode.cn/problems/two-sum/

使用双指针前需要排序,这会使得数之间的顺序发生变化,而两数之和返回的索引。所以在这道题排序之前需要记住每个数字的索引

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        nums = sorted(
            (num, idx) for idx, num in enumerate(nums)
        )
        i, j = 0, len(nums) - 1
        while i < j:
            num1, idx1 = nums[i]
            num2, idx2 = nums[j]
            if num1 + num2 == target:
                res = [idx1, idx2]
                break
            elif num1 + num2 > target:
                j -= 1
            else:
                i += 1
        return res

15. 三数之和icon-default.png?t=MBR7https://leetcode.cn/problems/3sum/
18. 四数之和icon-default.png?t=MBR7https://leetcode.cn/problems/4sum/

三数之和和四数之和最重要的是去重,可以使用set函数,使得代码具有通用性。三数之和中第一个数使用for循环,其他两个数字使用双指针,时间复杂度O(n2) 。四数之和中前两个数使用for循环,其他两个数字使用双指针,时间复杂度O(n3) 

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        if len(nums)<3:
            return []
        nums.sort()
        res = set()
        for i in range(len(nums)-2):
            left,right = i+1,len(nums)-1
            while left<right:
                if nums[i]+nums[left]+nums[right]==0:
                    if (nums[i],nums[left],nums[right]) not in res:
                        res.add((nums[i],nums[left],nums[right]))
                    left+=1
                    right-=1
                elif nums[i]+nums[left]+nums[right]>0:
                    right-=1
                else:
                    left+=1
        return list(res)
class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        if len(nums)<4:
            return []
        nums.sort()
        res = set()
        for i in range(len(nums)-3):
            for j in range(i+1,len(nums)-2):
                left,right = j+1,len(nums)-1
                while left<right:
                    if nums[i]+nums[j]+nums[left]+nums[right]==target:
                        if (nums[i],nums[j],nums[left],nums[right]) not in res:
                            res.add((nums[i],nums[j],nums[left],nums[right]))
                        right-=1
                        left+=1
                    elif nums[i]+nums[j]+nums[left]+nums[right]>target:
                        right-=1
                    else:
                        left+=1
                    
        return list(res)

 16. 最接近的三数之和icon-default.png?t=MBR7https://leetcode.cn/problems/3sum-closest/

 

class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        nums.sort()
        res = nums[0]+nums[1]+nums[len(nums)-1]
        for i in range(len(nums)-2):
            if i>0 and nums[i]==nums[i-1]:
                continue
            left,right = i+1,len(nums)-1
            while left<right:
                temp = nums[i]+nums[left]+nums[right]
                if abs(target-temp)<abs(target-res):
                    res = temp
                if temp==target:
                    return temp
                elif temp<target:
                    left+=1
                else:
                    right-=1
        return res

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值