LeeCode Two nums问题
问题描述:
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。如果有好的解决方法欢迎讨论。

浙公网安备 33010602011771号