LeetCode1 Two Sum
题目 :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. (Easy)
解法1: Two pointers
拷贝一份,将数组排序,两根指针分别从前后向中间扫描,找到解为止。再遍历原数组寻找下标添加到结果内。
复杂度: O(nlogn)
注意:比如0,3,4,0 target = 0这组数据,需要让result第二个参数从后向前扫描才能保证答案正确。
代码:
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 vector<int> v(nums); 5 vector<int> result; 6 sort(nums.begin(), nums.end()); 7 int i = 0,j = nums.size() - 1; 8 while (nums[i] + nums[j] != target) { 9 if (nums[i] + nums[j] > target) { 10 j--; 11 } 12 else { 13 i++; 14 } 15 } 16 for (int k = 0; k < nums.size(); ++k) { 17 if (v[k] == nums[i]) { 18 result.push_back(k); 19 break; 20 } 21 } 22 for (int k = nums.size() - 1; k >= 0; --k) { //从后向前扫描 23 if (v[k] == nums[j]) { 24 result.push_back(k); 25 break; 26 } 27 } 28 return result; 29 } 30 };
解法2:
利用hash表建立数值与下标的一一对应,扫描一遍即得解。
注: 本以为是O(n),但运行时间比解法1居然慢,查看discuss得知没有注意find()方法在最差情况下执行效率是O(n)的。
代码:
1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, int target) { 4 //数值 与 下标一一对应 5 unordered_map<int,int> hash; 6 vector<int> result; 7 for (int i = 0; i < nums.size(); ++i){ 8 if (hash.find(target - nums[i]) != hash.end()) { 9 result.push_back(hash[target - nums[i]]); 10 result.push_back(i); 11 return result; 12 } 13 hash[nums[i]] = i; 14 } 15 return result; 16 } 17 };