題目鏈結
問題:
給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
通過次數1,348,299
提交次數2,732,584
思路:
①雙指標掃瞄法(o(n)):乙個頭指標乙個尾指標,令頭尾指標指的數相加,小了頭指標後移,大了尾指標前移(即楊式矩陣的思維方式).
***** 楊式矩陣(n*m):行和列都是遞增的.
***** 查詢某值x:從右上角(本行最大,本列最小,或者左下角-本列最大,本行最小)那個數字開始,小了向下走,大了向左走,最多走n+m步,時間複雜度o(n+m).
②二分法(o(nlogn)):前提是資料有序. 設定乙個頭指標p,排序後按序指向某個數x,用二分查詢target-x,若找到就返回這兩個數的下標,否則p後移繼續查詢.
③雜湊表(o(n)):unordered_map基於雜湊表不保證資料有序性,map基於紅黑樹會保證資料有序性,雜湊表無論資料有序無序都能用,維護的是當前位置之前的集合.
1/*雙指標掃瞄法
*/2 #include 3
using
namespace
std;45
class
solution
13sort(vec.begin(), vec.end());
14int p=0, q=vec.size()-1;15
while(1
) 22
int a=vec[p].second;
23int b=vec[q].second;
24if(a>b) swap(a, b);
25 vectorret;
26ret.push_back(a);
27ret.push_back(b);
28return
ret;29}
30 };
1/*二分法
*/2 #include 3
using
namespace
std;45
class
solution
16return -1;17
}1819 vector twosum(vector& nums, int
target)
25sort(vec.begin(), vec.end());
26for(int i=0; i)
35return
ret;36}
37 };
1/*雜湊表
*/2 #include 3 #include 4
using
namespace
std;56
class
solution else21}
22return
ret;23}
24 };
紀念在力扣刷的第一題——這裡要感謝一下船長,雖然我不是船員.
leetcode1 (簡單)兩數之和
1.問題 給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 2.自己編寫的程式 時間複雜度太高,用時68...
1 兩數之和(簡單,陣列)
給定乙個整數陣列nums和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所...
leetcode1 兩數之和(簡單)
給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...