二分查詢 演算法總結

2021-09-25 20:08:44 字數 2447 閱讀 9218

二分查詢也稱折半搜尋,是一種在有序陣列中查詢某一特定的元素的搜尋演算法

class solution else if(nums[mid]mid=(left+right)/2;

**在left和right都很大的時候會出現溢位的情況,從而導致陣列訪問溢位。

改進方法將加法變為減法:mid=left+(right-left)/2;

或者是使用神奇的位運算:   mid=left+((right-left)>>>1);

看題目的題目的意思就是最基本的二分查詢直接擼**

通過了確實是通過了 然後我跑去瞄了一下最快的**發現他和我的區別就是計算mid的時候沒有使用防止溢位的方法。

題目描述:

給定乙個按照公升序排列的整數陣列 nums,和乙個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。

你的演算法時間複雜度必須是 o(log n) 級別。

如果陣列中不存在目標值,返回 [-1, -1]。

這個題目的基本思路:

第一步用二分查詢找出到乙個與target數值相同的元素並記錄下標,

然後查詢它的左邊和右邊,直到碰到與target不同的值記錄下標。

基本思路有了 好了直接上**!

過了之後還是去瞟了一下速度最快的**發現思路都差不多

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

請找出其中最小的元素。

你可以假設陣列中不存在重複元素。

思路:看到這個題第一步覺得自己可以抖個機靈直接排序一下輸出最小的

class solution

}

還過了。。。。但是要3ms好慢的感覺,老老實實的用二分

官方二分解法

class solution 

int i=0;

int j=nums.length-1;

if(nums[j]>nums[0])

while(i<=j)

if(nums[mid-1]>nums[mid])

if(nums[mid]>nums[0])else

}return -1;}}

官方的解法思路清晰一看就懂,但是碼量太多了

這裡有一種簡單不容易懂的解法

class solution else 

}return i;}}

思路:每次計算mid,如果mid是遞增的,則結果在mid右邊;如果mid是遞減的,則結果在mid左邊 。

因為答案是返回任意峰值,所以**比較少。

編寫乙個高效的演算法來判斷 m x n 矩陣中,是否存在乙個目標值。該矩陣具有如下特性:

每行中的整數從左到右按公升序排列。

每行的第乙個整數大於前一行的最後乙個整數。

class solution 

int row=0;

int col=matrix[0].length-1;

while(row=0)else if(matrix[row][col]簡單點來將就是利用矩陣公升序的特點,因為從左到右公升序, 從上到下公升序。所以每次可以去掉一行 / 一列。

另一種解法就是通過將二維陣列直接將為一維陣列,然後進行二分查詢

class solution

}return false;

}}

演算法總結 二分查詢

本文首發於我的個人部落格 尾尾部落 二分查詢法作為一種常見的查詢方法,將原本是線性時間提公升到了對數時間範圍,大大縮短了搜尋時間,但它有乙個前提,就是必須在有序資料中進行查詢。二分查詢很好寫,卻很難寫對,據統計只有10 的程式設計師可以寫出沒有bug的的二分查詢 出錯原因主要集中在判定條件和邊界值的...

演算法總結 二分查詢

二分查詢法作為一種常見的查詢方法,將原本是線性時間提公升到了對數時間範圍,大大縮短了搜尋時間,但它有乙個前提,就是必須在有序資料中進行查詢。二分查詢很好寫,卻很難寫對,據統計只有10 的程式設計師可以寫出沒有bug的的二分查詢 出錯原因主要集中在判定條件和邊界值的選擇上,很容易就會導致越界或者死迴圈...

二分查詢演算法c語言 演算法總結 二分查詢法

在leetcode的題目討論中,經常會有些大神將某一類的題目結題思路給整理了出來,感覺受益匪淺。受之啟發,萌生了自己也總結一下常見演算法的解題思路的想法,希望可以讓自己在這個總結的過程中可也融匯貫通這些思路,同時可以給後來者以啟發。從 開始好呢?就從經典的二分查詢法開始吧,這個演算法幾乎所有學過計算...