LeetCode中国官网一个用来刷编程题的网站,收录了很多面试题。感觉还是学习到很多。记录一下思路。代码还是要多敲。
建议编写完后直接在LeetCode上运行和提交。提交时会有不同的测试用例来测试代码。可以查遗补漏。
时间有限,之后会持续更新
1)两数之和
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
最简单的直接两个循环暴力解决。
class Solution(object):
def twoSum(self, nums, target):
num = len(nums)
for i in range(num):
for j in range(i+1,num):
if nums[i] + nums[j] == target:
return [i,j]
if __name__ == '__main__':
n = [3,2,4]
tar = 6
s = Solution()
a = s.twoSum(n,tar)
print(a)
没有啥可多说的,就是第一层循环所有,第二层从第一层所在的下标后一位开始。然后相加看是不是等于某个值,然后返回下标。在LeetCode提交时候,提示用时4172ms
之后看到官方和别人的解题思路,可以使用字典来提高效率。
class Solution(object):
def twoSum(self, nums, target):
nub = len(nums)
dict1 = {}
for i in range(nub):
value = target - nums[i]
if value in dict1:
return [dict1[value],i]
dict1[nums[i]] = i
if __name__ == '__main__':
n = [3,2,4]
tar = 6
s = Solution()
a = s.twoSum(n,tar)
print(a)
思路是将数组的值当做字典的键,数组的下标当做字典键。循环 i 就是数组当前值得下标。求合值减去当前值,算出另一个数的值。如果这个值是字典里存在的键。就返回键在字典中对应的值,和 i 。最后是将数组的值添加到字典里面。用时56ms
需要注意的是,一定要先判断一轮,再将值写入字典。以上图为例,如果先写入字典。下标0的时候,值是3。另一个需要的数也是3.这时候去字典里找第一个就是3.输出就会是[0, 0] ,但是正确的应该是[1, 2]。