二分查詢也稱折半搜尋,是一種在有序陣列中查詢某一特定的元素的搜尋演算法。
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的題目討論中,經常會有些大神將某一類的題目結題思路給整理了出來,感覺受益匪淺。受之啟發,萌生了自己也總結一下常見演算法的解題思路的想法,希望可以讓自己在這個總結的過程中可也融匯貫通這些思路,同時可以給後來者以啟發。從 開始好呢?就從經典的二分查詢法開始吧,這個演算法幾乎所有學過計算...