1. 程式人生 > 其它 >LeetCode 1:兩數之和

LeetCode 1:兩數之和

技術標籤:刷題資料結構演算法

索引請參考:系列目錄
題目:

  • 給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。
  • 你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。
  • 示例:輸入nums = [2,7,11,15],target = 9
    • 輸出:[0,1],原因: nums[0] + nums[1] = 2 + 7 = 9

分析:
思路1:

  • 暴力法:兩個迴圈進行不斷的判斷,若滿足條件返回索引值。否則返回空陣列

思路2:

  • 利用unordered_map的成員函式count進行判斷,在利用其hash的性質返回索引值

思路1:

std::vector<int> twoSum2(const std::vector<int> & nums, const int target) {
	
	for (int i = 0; i < nums.size(); i++)
	{
		for (int j = i + 1; j < nums.size(); j++)
		{
			if (nums[i] + nums[j] == target && i != j)
				return{ i,j };
		}
	}
	return{};
}

leetcode執行結果:

在這裡插入圖片描述
思路2:

std::unordered_map<int, int>coll;
	int size = nums.size();
	for (int i = 0; i < size; i++)
		coll[nums[i]] = i ;
	for (int i = 0; i < size; i++)
	{
		if (coll.count(target - nums[i]) > 0 && i != coll[target - nums[i]])
			return{ i,coll[target - nums[i]] };
	}
	return{};

leetcode執行結果:

在這裡插入圖片描述

評註:從理論上分析,思路2的時間複雜度為O(nlogn),而思路2的時間複雜度為O(n^2),應該時相差了一個級別的效果,但是實際執行結果卻與理論設想正好相反。本人才疏學淺,至今還是不理解leetcode和牛客測試程式的執行時間理論依據是什麼。。。
這道題的節體思路和劍指offer面試題57:和為S的兩個數字相似。具體請參考和對比這兩道題~
【每天多瞭解一點點】