题目链接: 两数之和
这个题我们可以简单的想到暴力枚举的方案,让所有的数字两两组合,如果等于目标值.就返回对应的索引.
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 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法