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。如果有好的解决方法欢迎讨论。

猜你喜欢

转载自www.cnblogs.com/1621325877qq/p/10429301.html
two