我是靠谱客的博主 难过豆芽,最近开发中收集的这篇文章主要介绍leetcode【1+167 Two Sum 系列】【python】1 Two Sum167 Two Sum II –Input array is sorted,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1 Two Sum

找到给定序列中两个数字的和是指定target,返回的是个list,包含两个数的index,从0开始。

第一反应肯定是遍历,毕竟是数组题,遍历需要两遍,才能找到和,那么肯定是要优化的了。
因为是查找,所以可以想到hash,查找只需要O(1)复杂度。那么维持一个dict,其中key是数值,value是数值对应的下标。最初的想法是从数组中每取到一个数字nums[i],判断nums[i]在不在dict中,后来想到它在不在没有太大的意义,它在也要进一步判断target-nums[i]是否存在,才能找到两个数字,它不在那么当然就是把nums[i]存进dict。所以呢,不如直接判断target-nums[i]是不是在,如果在,那么它对应的value肯定是返回数组res[0],nums[i]所在的第i位就是res[1]了,如果不在,还是一样把nums[i]放入。

代码如下:

class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
temp = dict()
result = [-1, -1]
for i in range(len(nums)):
if target-nums[i] in temp.keys():
result[1] = i
result[0] = temp.get(target - nums[i])
break
else:
temp[nums[i]] = i
return result

167 Two Sum II –Input array is sorted

跟上一题想多,改变有两处,一个是给定的数组是排好序的,另一个是返回的下标是从1开始的。当然后者对做题没有什么影响。我们仍然可以使用hash的方法来实现这个题。我也确实是这么做的。。。那么当第二遍做这道题的时候,我想到排序对这道题的改变,忽然就想到了two points,也就是夹逼的思想,哈哈哈。从头和从尾同时向内逼近。

class Solution(object):
def twoSum(self, numbers, target):
"""
:type numbers: List[int]
:type target: int
:rtype: List[int]
"""
left = 0
right = len(numbers) -1
while(left < right):
if(numbers[left] + numbers[right] == target):
return [left+1,right+1]
elif(numbers[left] + numbers[right] < target):
left += 1
else:
right -= 1

就是这样啦 这道题我们了解了夹逼、hash表。其实c++javepython这些都自带hash表功能的内置数据结果的,只有c木有啦,python里是dict(),key-value对应的这种形式。它自带很多方法,可以很灵活的使用嗒

最后

以上就是难过豆芽为你收集整理的leetcode【1+167 Two Sum 系列】【python】1 Two Sum167 Two Sum II –Input array is sorted的全部内容,希望文章能够帮你解决leetcode【1+167 Two Sum 系列】【python】1 Two Sum167 Two Sum II –Input array is sorted所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(27)

评论列表共有 0 条评论

立即
投稿
返回
顶部