Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
先遍历一遍数组,建立hash表,再遍历一遍数组,找出下标
c++代码:
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 unordered_map<int, int> m; 5 vector<int> res; 6 for (int i = 0; i < nums.size(); ++i) { 7 m[nums[i]] = i; 8 } 9 for (int i = 0; i < nums.size(); ++i) { 10 int t = target - nums[i]; 11 if (m.count(t) && m[t] != i) { 12 res.push_back(i); 13 res.push_back(m[t]); 14 break; 15 } 16 } 17 return res; 18 } 19 };
其实第一遍遍历数组的时候就可以判断了,这样可以优化代码为
c++代码
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 unordered_map<int, int> m; 5 for(int i = 0; i < nums.size(); ++ i) 6 { 7 int n = target - nums[i]; 8 if(m.count(n)) 9 return {i, m[n]}; 10 m[nums[i]] = i; 11 } 12 return {}; 13 } 14 };