leetcode經典題目(3) 二分查詢

2021-10-07 08:52:14 字數 2732 閱讀 9367

二分查詢的注意點:

(1)左右指標的初始值以及更新規則;

(2)迴圈條件,l<=h得到的h比l小1,l1. 求平方根(no.69)

題目描述:計算並返回 x 的平方根,其中 x 是非負整數。由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。

解題思路:二分查詢。在迴圈條件為 l <= h 並且迴圈退出時,h 總是比 l 小 1,也就是說 h = 2,l = 3,因此最後的返回值應該為 h 而不是 l。在判斷條件中,不能使用mid*mid,可能會越界。

class

solution

return h;}}

;

2. 大於給定元素的最小元素(no.744)

題目描述:給你乙個排序後的字元列表 letters ,列表中只包含小寫英文本母。另給出乙個目標字母 target,請你尋找在這一有序列表裡比目標字母大的最小字母。在比較時,字母是依序迴圈出現的。

解題思路:如果l==letters.size(),說明letters中的所有元素都小於target,此時返回letters[0];其他情況下,迴圈結束後,h所指元素小於等於target,l所指元素大於target,所以返回l所指元素。

class

solution

if(l >= letters.

size()

)//letters中所有元素都小於target,返回首元素

return letters[0]

;else

return letters[l]

;//返回l所指元素}}

;

3. 有序陣列的 single element(no.540)

題目描述:給定乙個只包含整數的有序陣列,每個元素都會出現兩次,唯有乙個數隻會出現一次,找出這個數。注意: 您的方案應該在 o(log n)時間複雜度和 o(1)空間複雜度中執行。

解題思路:要求以 o(logn) 時間複雜度進行求解,因此不能遍歷陣列並進行異或操作來求解,這麼做的時間複雜度為 o(n)。若m為偶數,如果 nums[m] == nums[m + 1],那麼 index 所在的陣列位置為 [m + 2, h],此時令 l = m + 2;如果 nums[m] != nums[m + 1],那麼 index 所在的陣列位置為 [l, m],此時令 h = m。

class

solution

return nums[l];}

};

4. 第乙個錯誤的版本(no.278)

題目描述:你是產品經理,目前正在帶領乙個團隊開發新的產品。不幸的是,你的產品的最新版本沒有通過質量檢測。由於每個版本都是基於之前的版本開發的,所以錯誤的版本之後的所有版本都是錯的。假設你有 n 個版本 [1, 2, …, n],你想找出導致之後所有版本出錯的第乙個錯誤的版本。

你可以通過呼叫 bool isbadversion(version) 介面來判斷版本號 version 是否在單元測試**錯。實現乙個函式來查詢第乙個錯誤的版本。你應該儘量減少對呼叫 api 的次數。

解題思路:二分法查詢,如果m版本是錯誤的,則第乙個錯誤版本就是m或者在m之前,所以令h=m;如果m版本是正確的,則第乙個錯誤版本在m之後,令l=m+1.

// the api isbadversion is defined for you.

// bool isbadversion(int version);

class

solution

return l;}}

;

5. 旋轉陣列的最小數字(no.153)

題目描述:假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。請找出其中最小的元素。你可以假設陣列中不存在重複元素。

解題思路

class

solution

return nums[h];}

};

6. 查詢區間(no.34)

題目描述:給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。演算法時間複雜度必須是 o(log n) 級別。如果陣列中不存在目標值,返回 [-1, -1]。*

解題思路:定義函式firstindex使用二分查詢的思想在陣列中查詢target出現的第乙個位置。這裡注意:(1)在初始化r時,令r=nums.size(),這樣,當target的值可能大於陣列中的所有元素,返回的是nums.size(),從而能夠覆蓋 target 大於 nums 最後乙個元素的情況;(2)如果target不在nums中,返回的是陣列中大於target的元素的第乙個位置;(3)用first記錄第一次出現的位置,如果first等於nums.size(),或first所指的值不等於target,表示沒有找到。

class

solution

}int

firstindex

(vector<

int> nums,

int target)

return l;}}

;

Leetcode 二分題目總結

二分搜尋一般有列舉下標和列舉值兩種,mid表示下標或者某乙個值。這樣的二分搜所通常涉及兩個函式定義,乙個叫upper bound,乙個叫lower bound,這裡會產生邊界問題。從筆試 面試的角度來說,筆試中,常常涉及到二分搜尋的題目,這樣的題目,由於時間充足,允許不斷除錯,有部分分,另外需要注意...

題目1 二分 二分查詢

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩艘船的稀有...

題目1 二分 二分查詢

link 時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述nettle最近在玩 艦 因此nettle收集了很多很多的船 這裡我們假設nettle氪了很多金,開了無數個船位 去除掉重複的船之後,還剩下n 1 n 1,000,000 種不同的船。每一艘船有乙個稀有值,任意兩...