LeetCode 1:兩數之和
阿新 • • 發佈:2021-01-02
索引請參考:系列目錄
題目:
- 給定一個整數陣列 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的兩個數字相似。具體請參考和對比這兩道題~
【每天多瞭解一點點】