leetcode - 1 两数之和

思路

由于是求数组中两数之和为S,所以正常情况下可以对这个数组进行排序,然后使用双索引,数组第一个元素和最后一个元素求和,当和为S时皆大欢喜,如果和大于S的话则表明和太小了,于是前面的索引向后移动,如果和小于S的话则表明和太大了,于是后面的索引向前移动,最终当两个索引相同时结束(因为同一个数只能选择一次,所以当索引相同时循环结束)

难点
  • 因为这里是返回原数组中的索引,而如果对数组进行排序后则索引会丢失,所以使用map保存索引(pair为值-索引)
  • 数组中值可能相同,比如数组中第一个1传进map,第二个1又传进map,则后面一个1的索引会覆盖前一个1的索引,这样当S为2时,可能就是两个1的和,而map中只存了一个1,所以需要将所有的1都保存,这里使用multimap
#include <vector>
#include <iostream>
#include <map>
using namespace std;

class Solution {
public:
	vector<int> twoSum(vector<int>& nums, int target) {
		multimap<int, int> m;
		for (int i = 0; i < nums.size(); i++)
			m.insert(make_pair(nums[i], i));
		map<int, int>::iterator begin = m.begin();
		map<int, int>::iterator end = --m.end();
		while (begin != end) {
			if (begin->first + end->first == target) {
					int res[2] = { begin->second,end->second };
					return vector<int>(res, res + 2);
			}
			else if (begin->first + end->first > target) {
				end--;
			}
			else if (begin->first + end->first < target) {
				begin++;
			}
		}
		// leetcode要求必须返回,即使这里永远也运行不到
        return vector<int> ();
	}
};

int main() {

	const int nums[] = { 3,2,4 };
	vector<int> nums_vec(nums, nums + sizeof(nums) / sizeof(int));
	int target = 6;

	vector<int> res = Solution().twoSum(nums_vec, target);
	cout << res[0] << " " << res[1] << endl;
	system("pause");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章