LeetCode 刷题小本本Day1 Two Sum

Posted strawberry47

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 刷题小本本Day1 Two Sum相关的知识,希望对你有一定的参考价值。

(1) Two Sum

题目:

Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.
给定一个list和target,找到list中加起来等于target的索引,不能重复使用值。

我的答案:

    def twoSum1(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        for i in nums:
            sub = target - i
            nums_copy = nums.copy()
            nums_copy.remove(i)
            if sub in (nums_copy):
                index_i = nums.index(i)
                index_j = nums.index(sub,index_i+1)
                break
        return [index_i, index_j]

遇到的问题:

  1. 怎么解决“不允许重复值”:拷贝一个list;获取索引时从index_i+1开始找。

参考答案1:

    def twoSum(self, nums, target):
        hashmap = {}
        for i in range(len(nums)):
            complement = target - nums[i]
            if complement in hashmap:
                return [i, hashmap[complement]]
            hashmap[nums[i]] = i

更好的处理了不能重复使用相同值的问题:

  • 逻辑:找当前值和出现在他之前的值之和,有没有等于target的。
  • 这个地方建立了一个hashmap,相当于字典啦,不过不是一次性建立的,可以解决“一个值不能用两次的问题”。

参考答案 2:

class Solution:
    def twoSum(self, nums, target):
        h = {}
        for i, num in enumerate(nums):
            n = target - num
            if n not in h:
                h[num] = i
            else:
                return [h[n], i]

这个地方把list转成了dict,然后也用了hashmap的思路。

收获:

  1. list变量获取索引:num.index(i)
  2. list 变量删除元素 nums.remove(i),返回的是NoneType,所以直接用nums就好啦。
  3. list直接赋值就是对象的引用(别名);浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
  4. list转dictionary,需要利用enumerate(将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列):dict(list(enumerate(nums)))。也可以直接for i, num in enumerate(nums)
  5. hashmap的形式查找,可以避免出现重复值。

以上是关于LeetCode 刷题小本本Day1 Two Sum的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题笔记-动态规划-day1

LeetCode刷题笔记-动态规划-day1

LeetCode刷题笔记-动态规划-day1

LeetCode刷题笔记-数据结构-day1

leetcode刷题day1

leetcode刷题day1