美文网首页
两数之和 - 双指针、字典

两数之和 - 双指针、字典

作者: RayRaymond | 来源:发表于2020-04-23 14:34 被阅读0次

1. 两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

暴力遍历

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n = len(nums)
        for x in range(n):
            y = target - nums[x]
            if y in nums:
                if nums.count(y) == 1 and y == nums[x]:
                    continue
                else:
                    y_index = nums.index(y,x+1)
                    # 输入只会对应一个答案
                    break
        # 有可能找不到
        if y_index:
            return [x,y_index]
        else:
            return []

优化暴力

先找到一个x,再从 x 之前的部分查找 y

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n = len(nums)
        for x in range(1,n):
            temp = nums[:x]
            if (target - nums[x]) in temp:
                y_index = temp.index(target - nums[x])
                break
        if y_index:
            return [y_index,x]
        else:
            return []

先找x,再从 x 之后的部分查找 y
注意: y_index 一开始只有在 x 之后的部分 的,需要加上 x_index + 1

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n = len(nums)
        for x in range(0,n-1):
            temp = nums[x+1:]
            if (target - nums[x]) in temp:
                y_index = temp.index(target - nums[x]) + x + 1
                break
        if y_index:
            return [x,y_index]
        else:
            return []

字典模拟哈希

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashmap={}
        for num_index,num in enumerate(nums):
            hashmap[num] = num_index
        for num_index,num in enumerate(nums):
            x = None
            if (target - num) in hashmap:
                x = hashmap[target - num]
            if x and num_index!=x:
                return [num_index,x]

优化哈希 建表同时查找

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashmap={}
        for i,num in enumerate(nums):
            if (target - num) in hashmap:
                return [i,hashmap[target - num]]
            hashmap[num] = i

167. 两数之和 II - 输入有序数组

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

示例:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。

双指针

class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        n = len(numbers)
        if n < 2:
            return []
        L,R = 0,n-1
        while L < R :
            if target == numbers[L] + numbers[R]:
                return[L+1,R+1]
            elif target > numbers[L] + numbers[R]:
                L += 1
            else:
                R -= 1
        return []

字典

class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        dic = {}
        for x,x_val in enumerate(numbers):
            y = target - x_val
            if y in dic:
                return([dic[y]+1,x+1])
            dic[x_val] = x
        return []

560. 和为K的子数组

class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        num_times = collections.defaultdict(int)
        num_times[0] = 1
        cur_sum = 0
        res = 0
        for i in range(len(nums)):
            cur_sum += nums[i]
            if cur_sum - k in num_times:
                res += num_times[cur_sum - k]
            num_times[cur_sum] += 1
        return res

相关文章

  • 两数之和 - 双指针、字典

    1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整...

  • algrithrom

    求和问题,双指针解决 done 两数之和 三数之和 最接近三数之和 四数之和 链表反转问题 done 链表反转 链...

  • 双指针--三数之和

    目录[https://www.jianshu.com/p/85e18c21317a] 题号[https://lee...

  • 双指针法(算法)

    案例: 盛最多水的容器、三数之和、最接近的三数之和 双指针法一般对应于有序数组的情况,通过调节指针(左右移动),...

  • LeetCode咸鱼记录

    15. 三数之和 先排序,然后用双指针往中间移动查找符合条件的数。

  • [双指针学习-待补充]最接近三数之和

    依旧是求三数之和,这个暴力可解但是最好的方法是双指针。lc16 双指针 待补充学习

  • 常用算法

    以下题号如无说明表示在中文leetcode上的题号双指针:15(三数之和)

  • LeetCode-16 最接近的三数之和

    题目:16. 最接近的三数之和 难度:中等 分类:数组 解决方案:双指针 今天我们学习第16题最接近的三数之和,这...

  • LeetCode-15 三数之和

    题目:15. 三数之和 难度:中等 分类:数组 解决方案:双指针 今天我们学习第15题三数之和,这是一道中等题。像...

  • LeetCode-18 四数之和

    题目:18. 四数之和 难度:中等 分类:数组 解决方案:双指针 今天我们学习第18题四数之和,这是一道中等题。像...

网友评论

      本文标题:两数之和 - 双指针、字典

      本文链接:https://www.haomeiwen.com/subject/gwcaihtx.html