1 兩數之和(簡單)

2022-06-05 05:36:08 字數 1741 閱讀 6372

題目鏈結

問題:

給定乙個整數陣列 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 ...