LeetCode 1. 两数之和
题目:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
思路:
方法一:
有2个情况要考虑,一个是正常的a+b=target,另一个是a+a=target。
通过target减去list内部数字,判断是否存在作为过滤条件
1)index数量大于等于2,index相同的元素不能使用2次
2)为了保证顺序,减数的index要比当前的i值大。
最后把index就存到新的list里面即可
class Solution(object):
def twoSum(self, nums, target):
list = []
i = 0
while i < len(nums):
while target-nums[i] in nums:
if nums.count(target-nums[i])>=2:
if len(list) ==2:
break
else:
list.append(i)
else:
if nums.index(target-nums[i])>i:
list.append(i)
list.append(nums.index(target-nums[i]))
break
i +=1
return list
--执行结果
执行用时 :1232 ms, 在所有 Python 提交中击败了38.06%的用户
内存消耗 :13.4 MB, 在所有 Python 提交中击败了6.17%的用户
方法二:
因为方法一的用时相对有些多,所以参考大牛们的意见采用key value的字典模拟hashmap去筛选过滤。
字典依次遍历按照value index的方式存入新的dic,当遍历dic找到target - value的值时返回当前dic中保存符合的index和当前的index,即符合题目要求
class Solution(object):
def twoSum(self, nums, target):
dic = {}
for i, value in enumerate(nums):
if target - value in dic:
return [dic[target - value], i]
dic[value] = i
执行用时 :36 ms, 在所有 Python 提交中击败了73.27%的用户
内存消耗 :14.3 MB, 在所有 Python 提交中击败了6.17%的用户
总结:
本以为这个题目很简单,没想到花了我不少时间去思考用时问题,第一时间想起来的方式就是通过列表去做这个事情,没想到用dic 更省时间,下决心要好好刷leet code练习自己的解题思路还有时间算法处理能力,加油。