LC1-两数之和
1. 两数之和
分析:我们的思路是:先确定一个数,然后再确定一个数。确定第二个数的时候可以利用两种方法加速:(朴素做法是遍历)
-
二分查找。时间复杂度为
O(nlogn)
, 但是由于此题数组不是有序的,所以不好直接二分。(理论上强行排序记录原有下标,仍然可以二分,但是过于繁琐,意义不大。)
-
哈希表。 时间复杂度为
O(n)
-
暴力
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int n = nums.size(); for(int i = 0; i < n; ++i) for(int j = 0; j < i; ++j) if(nums[i] + nums[j] == target)return {j, i}; return {-1, -1}; } };
-
哈希表
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int,int>hash; for(int i = 0; i < nums.size(); ++i) if(hash.count(target - nums[i])) return {hash[target - nums[i]], i}; else hash[nums[i]] = i; return {-1, -1}; } };