1. 两数之和
这个题我们可以简单的想到暴力枚举的方案,让所有的数字两两组合,如果等于目标值.就返回对应的索引.
python代码如下:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
n=len(nums)
for i in range(n):
for j in range(i+1,n):
if nums[i]+nums[j]==target:
return [i,j] c++代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for (int i = 0; i < nums.size(); i++) {
for (int j = i + 1; j < nums.size(); j++) {
if (nums[i] + nums[j] == target) {
return vector<int>{i, j};
}
}
}
return vector<int>();
}
};但是这里使用了双层循环.时间复杂度是O($n^2$).我们就可以换个角度看能不能优化一下.既然我们要找$x+y=target$.那遍历数组,就是要找$y=target-x$.
但是如果使用查找算法,去查找每一个y,那么时间复杂度也很高,这时候我们就可以使用哈希表了.每遍历一个元素x,如果哈希表里有对应的y,就直接返回两个数的索引,如果没有,就把这个数作为键,把索引作为值存进哈希表.那么时间复杂度就可以优化到O(n)的一个时间复杂度.
python代码如下:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
n=len(nums)
hs=dict()
for i in range(n):
y=target-nums[i]
if y in hs:
return [i,hs[y]]
hs[nums[i]]=ic++代码如下:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hs;
for (int i = 0; i < nums.size(); i++) {
int y = target - nums[i];
if (hs.count(y))
return vector<int>{i, hs[y]};
hs[nums[i]] = i;
}
return vector<int>{};
}
};
原创
leetcode-1.两数之和
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法