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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章