高頻演算法面試題學習總結 線性結構1 兩數之和

2021-09-10 17:40:44 字數 1530 閱讀 4131

題目:有乙個整數陣列nums,能否從中取出兩個數,使他們的和為target。

輸入1:

nums =

target  = 12

輸出1:

true

輸入2:

nums =

target  = 8

輸出2:

false

首先由給出的輸入輸出案例,可知取出的兩個數不能為同乙個數(不放回取數);其次整數陣列nums是否有序是不確定的;最後陣列中可能會有相同元素,如若陣列nums改為,輸出即為true。

首先想到的是暴力法:利用雙指標,其中乙個指標固定,另乙個指標遍歷陣列。時間複雜度o(n*n)。

優化:先將陣列進行排序sort,從頭遍歷陣列,假設此時遍歷值為value,再使用二分查詢剩餘陣列是否存在                  (target-value)。時間複雜度o(n*logn)。

**實現:

#include#include#includeusing namespace std;

bool besum(vector& nums, int target)

return false;

}int main()

int target;

cin >> target;

if (besum(nums, target))

cout << "true" << endl;

else

cout << "false" << endl;

return 0;

}

若要得到o(n)的時間複雜度,該如何做呢?若使用時間複雜度為o(1)的雜湊查詢演算法進行查詢,便可使整體複雜度降為o(n)。

(1)首先可想到:將陣列全部存入雜湊表,再進行掃瞄和查詢,但若nums=,target=8,輸出為true,結果錯誤,pass;

(2)若給每個雜湊表項加上乙個計數值ct,用來存放數值重複次數,較麻煩,不採用;

(3)更簡單的實現:邊掃瞄邊構建雜湊表,逆向考察思路分析1,從最後乙個元素開始掃瞄,並查詢該元素之後的元素是否存在target-value,若查詢成功,即返回true,否則將該value加入雜湊表,再掃瞄前乙個元素。由對稱性可知,從第乙個元素開始掃瞄也具有同樣的效果。

**實現:

#include#include#includeusing namespace std;

bool besum(vector& nums, int target)

return false;

}int main()

int target;

cin >> target;

if (besum(nums, target))

cout << "true" << endl;

else

cout << "false" << endl;

return 0;

}

對於array的題目,可以優先考慮雙針模型。

箴言錄見賢思齊焉,見不賢而內自省也。

高頻演算法面試題學習總結 樹形結構2 共同祖先

題目 有個二叉樹,還有倆節點,如何找得到,最近的祖先 輸入 root value1 5 value2 6 解釋 1 2 3 null 4 5 6 root對應的是乙個樹形結構,1代表null,正整數代表這個節點的值,每個節點的值全域性唯一。輸出 3 思路1 對二叉樹進行dfs遍歷,記錄每個節點為根的...

MyBatis高頻面試題總結

什麼是sql注入?sql注入 sqli 是一種注入攻擊,可以執行惡意sql語句。它通過將任意sql 插入資料庫查詢,使攻擊者能夠完全控制web應用程式後面的資料庫伺服器。攻擊者可以使用sql注入漏洞繞過應用程式安全措施 可以繞過網頁或web應用程式的身份驗證和授權,並檢索整個sql資料庫的內容 還可...

演算法學習總結 線性資料結構遍歷

常見線性資料結構有陣列和鍊錶 遍歷方法分為以下兩種 迴圈遍歷 首先是陣列遍歷 var arr 1,2,3,4,5,6,7,8 function bianarr arr 其中在演算法中嚴謹性判斷非常重要,任何報錯行為都是不允許的,嚴謹性判斷是演算法的要素,在陣列中我們可以通過length獲取陣列長度,...