问题描述:
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].
解题:
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> point; int numsSize = nums.size(); vector<int> copyNums(numsSize); for (int i = 0; i < numsSize; ++i) copyNums[i] = nums[i]; sort(nums.begin(), nums.end()); int itHead, itTail; itHead = 0; itTail = nums.size() - 1; while (itHead != itTail) { if (nums[itHead] + nums[itTail] > target) itTail--; else { if (nums[itHead] + nums[itTail] < target) itHead++; else { break; } } } for (int i = 0, j = numsSize - 1; i <= j; ++i, --j) { if (copyNums[i] == nums[itHead] || copyNums[i] == nums[itTail]) { point.push_back(i); if (point.size() == 2) break; } if (copyNums[j] == nums[itHead] || copyNums[j] == nums[itTail]) { point.push_back(j); if (point.size() == 2) break; } } return point; } };
提交结果:
思考:
c++ STL中sort算法所使用的是类似于快排的排序算法,因此时间复杂度为O(nlog2N),然后加上两个vector遍历消耗时间为O(n),总时间复杂度为O(nlog2N),相对于普通的暴力求解时间复杂度O(n2)要小很多,快排也可以原地排序,因此空间复杂度也不是很大,然而在本例中空间复杂度不好(狗头),主要原因就是题目要求输出为原始的索引,然而排序之后索引无法保存,所以就复制了一遍,因此空间小号变成了double。如果有好的解决方法欢迎讨论。