2sum && 3sum 在数组中寻找几个数之和为target

这篇博客讨论了如何在整数数组中找到两数之和等于目标值(2sum问题)以及三数之和等于零(3sum问题)。对于2sum,提出了一种O(n^2)的解决方案,然后通过使用字典优化到O(n)。对于3sum,通过排序和双指针技术来降低复杂度,同时避免重复解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2sum

  • 题目描述
    Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution, and you may not use the same element twice.

  • 示例
    Given nums = [2, 7, 11, 15], target = 9,
    Because nums[0] + nums[1] = 2 + 7 = 9,
    return [0, 1].

  • 分析
    思路不是很难,因为假设只有一种解决方法,所以直接采用固定一个数,寻找另一个数是否在数组中即可,这样的复杂度为O(n2),需要寻找一个O(n)复杂度的解法,可以建立一个字典,将遍历过的数和索引放在字典中,空间换时间。

    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        dict = {}
        for i in range(len(nums)):
            other = target-nums[i]
            if other in dict:
                res=[dict[other],i]
                return res
            dict[nums[i]] = i
        

3sum

  • 题目描述
    Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

  • 示例
    Given array nums = [-1, 0, 1, 2, -1, -4],
    A solution set is:
    [
    [-1, 0, 1],
    [-1, -1, 2]
    ]

  • 分析
    解决问题的关键点在于降重,用一种O(n2)的的方式计算,同样先排序,很重要,然后再固定一个数,找另外的两个数,这两个数分别用左右指针前后一起遍历,注意计算过程中的降重

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        if nums==None or len(nums)<3:
            return
        nums.sort()
        res=[]
        for i in range(len(nums)-2):
            if i == 0 or nums[i]>nums[i-1]:
                left,right = i+1,len(nums)-1
                while left < right:
                    if nums[left]+nums[right]==-nums[i]:
                        res.append([nums[i],nums[left],nums[right]])
                        left+=1
                        right-=1
                        while left<right and nums[left]==nums[left-1]: left+=1
                        while left<right and nums[right] == nums[right+1]: right-=1
                    elif nums[left]+nums[right]<-nums[i]:
                        while left<right:
                            left+=1
                            if nums[left]>nums[left-1]:
                                break
            
                    else:
                        while left<right:
                            right-=1
                            if nums[right]<nums[right+1]:
                                break
        return res
                        
                    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值