C Leecode1 兩數之和

2022-06-19 02:18:10 字數 3564 閱讀 8316

->給定乙個整數陣列nums和乙個整數目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回它們的陣列下標。

->你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。

->你可以按任意順序返回答案。

->2 <= nums.length <= 103

->-109 <= nums[i] <= 109

->-109 <= target <= 109

->只會存在乙個有效答案

輸入:nums = [2,7,11,15], target = 9

輸出:[0,1]

解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

輸入:nums = [3,3], target = 6

輸出:[0,1]

整數陣列nums 整數目標值target ---------->符合條件整數的下標組成的陣列

->由於題目描述中可以按任意順序返回答案,所以[0,1]與[1,0]等價。

->同一元素不能用兩次:陣列中可能含有重複的數字,但是這些重複的數字的下標不同,所以他們屬於不同的元素,這點得注意,如演示例項二。

->題目假設答案唯一,也就是說不需要找到所有的答案,只要找到乙個答案就可以輸出,如果寫了乙個函式已經找出了答案,還往下尋找,就會增加程式的執行時間。

->窮舉演算法適用於所有尋找型別的問題,自己體會一下窮舉在下面應用場景的不同之處:

場景1:老師讓你從一年級一班裡找出乙個年齡在7歲以上的同學。

場景2:老師讓你從一年級一班裡找出所有年齡在7歲以上的同學。

場景3:老師讓你從一年級一班裡找出兩個年齡和為15歲的兩個人,用來參加這次的二人桌球比賽。

場景4:老師讓你從一年級一班裡找出兩個年齡和為15歲的兩個人的所有配對方式,然後通過綜合篩選出一對,用來參加這次的二人桌球比賽。

->可以看見,窮舉的基本過程可以描述為:對目標群體進行遍歷,對於遍歷所得到的目標進行篩選判斷,進而篩選出滿足條件的目標。

要注意的是,其中的遍歷,可以根據目標群體的型別,分為一次遍歷,二次遍歷等等,要明白,遍歷的目的只是為了得到可以用來被判斷的目標。

->顯然本題的場景跟場景3是相似的。

2.1陣列

->原諒我python看習慣了,竟然一開始下意識把c++的陣列的括號用成了中括號,寫成了int arr =[1,2,3],真是一點都不會c++啊。。。

->好像leecode的陣列用的都是vector,就是乙個可以存放任何型別資料的乙個動態陣列,並且這個動態陣列還有一些函式可以使用,如以下函式:

pop_back() //用於刪除動態陣列的最後乙個元素。

push_back() //用於在動態陣列尾部新增新的值。

empty() //用於判斷陣列是否為空,如果為空返回1;反之返回0。

size() //用於返回陣列中元素的個數。

->建立容器方式

#include //leecode裡自帶c++的標準庫,不需要匯入。

vectorvar;

2.2&與*

->*後跟指標型變數表示該指標所對應的數值,如int *p

->&後跟非指標型變數表示該變數的位址,如 p =&var

->乙個腦殘的**示範:

int *p;

int a =100;

int b =200;

&a =&b; //這行是錯誤的,對於乙個變數來說,變數值是可以修改的,但是變數的位址是不能修改的。

p =&b; /**這行是正確的,p雖然表示的是記憶體位址,但是它所表示的記憶體位址就是它這個指標型變數對應的值是沒有問題的,指標只是乙個特殊的變

量,它也有自己的記憶體位址,只不過它所對應的值剛好也是記憶體位址。**/

&p =&b; //這一行也是錯誤的,因為指標變數的位址不可以被修改,任何變數的位址都不能被修改。

->c++中&的另乙個作用----引用

宣告乙個引用,不是新定義了乙個變數,它只表示該引用名是目標變數名的乙個別名,它本身不是一種資料型別,因此引用本身不佔儲存單元,系統也不給引用分配儲存單元,這就是為什麼函式裡的引數多是引用,可以節省空間的開銷,還可以直接通過形參的改變進而改變實參,如

void swap(int &p1, int &p2) //此處函式的形參p1, p2都是引用

class solution    //因為題目中同乙個元素不能跟自己所匹配,所以起點從i往左移動乙個位置,使之跟自己前面的所有元素進行累加確定值是否為target
把上面的二次遍歷優化為雜湊表,索引為i的元素跟自己之前的所有元素進行匹配可以看做是跟雜湊表進行匹配,每一次迭代中,如果雜湊表找不到元素,就將雜湊表向右邊擴充乙個pair,**如下:

auto ii =hashmap.find(target-nums[i]); //這裡auto是c++11新標準,申明變數後自動確定該變數對應的型別。

if(ii!=hashmap.end());

}hashmap.insert(make_pair(nums[i],i));

2.1c++ 中的 ::

2.2c++ 中的unordered_map

->首先說一下,c++11在std中定義了很多容器,這些容器的效率非常高,根本沒有必要自己去定義資料結構,這裡的unordered_map就是一種類似於雜湊表的容器,它的作用就是優化查詢效率,而vector容器的作用就相當於於動態陣列,我真的是愛死c++了,本來以為c++中的庫很垃圾,跟python根本沒法比,但是現在才發現c++真的十分優美,高效,簡潔。這裡unordered_map的標頭檔案為,注意跟vector容器一樣,在leecode裡這些標頭檔案都預設已經有過了。

->unordered_map的迭代器是乙個指標,指向這個元素,通過迭代器來取得它的值,就相當於陣列裡的索引i一樣,初始迭代器就是i=0,末尾迭代器就是i=array.size()。

1 it->first;               // same as (*it).first   (the key value)
->成員函式

begin    返回指向容器起始位置的迭代器

end    返回指向容器末尾位置的迭代器 ,該迭代器指向unordered_map容器中最後乙個元素之後的位置

size    返回有效元素個數

empty 判斷是否為空,如果為空;返回1,非空返回0

find 如果key存在,則find返回key對應的迭代器,如果key不存在,則find返回unordered_map::end。可以通過map.find(key) == map.end()來確定key是否存在於unordered_map中。

insert 插入鍵值對,至於如何獲得鍵值對,可以使用std::make_pair函式獲得。

class solution ;

}hashmap.insert(make_pair(nums[i],i));

}return {};

}};

1 兩數之和

給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 解class solution hash nums i...

1 兩數之和

給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 由於元素不能重複利用,所以使用j i 1,通過雙迴圈,...

1 兩數之和

你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。public int twosum int nums,int target throw new illegalargumentexception no two sum solution 這樣的時間複雜度為0 nlogn 但是通過檢視官方的...