废弃很久的博客,终于从灰尘中捡起来了。摸鱼近一年,最终研果真没希望考上了。还是老老实实挨社会的毒打吧。leetcode刷题好平台,先用它来熟悉很久未上手的算法吧!
两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
题解
求和是二元的,两个循环刚好对应二元未知。直接暴力?
当然不可能,只用一个循环找数num,另一个数用target - num表示。
每遍历一个数,就把数num和数num的索引号ind放入一个字典dic中。
每次遍历时,都看看字典dic中是否有target-num这个数,如果有,那么就找到了x + y = target这个公式了。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dic = {}
for ind, num in enumerate(nums):
tmp = target-num
if tmp in dic:
return (dic[tmp], ind)
dic[num] = ind
以上是大佬的思路,简单明了44ms/14.6MB
下面是懵逼的我写的另一种思路,没用到字典,思路也就差不多,太过复杂:976ms/14MB
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
ln = len(nums)
for i in range(ln):
tmp = target - nums[i]
cnt = nums.count(tmp)
if (tmp == nums[i] and cnt>=2) or (tmp!=nums[i] and cnt>0):
a = i
b = nums[i+1:].index(tmp)+i+1
return (a, b)
翻译成C++如下16ms/13MB
:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int, int> dict;
map<int, int>::iterator it;
int other;
for(int i=0; i<nums.size(); i++){
other = target - nums[i];
if(dict[other]!=0) {
return {dict[other]-1, i};
}
dict[nums[i]] = i+1;
}
return {NULL, NULL};
}
};
数据感人,还待优化。。。
来源:CSDN
作者:梦醒时候
链接:https://blog.csdn.net/python_dream/article/details/104537879