二分法查詢是基於有序 專題系列 二分查詢

2021-10-14 06:22:01 字數 2554 閱讀 8871

這個題比較簡單,二分查詢的問題,一開始出錯了,進了迴圈出不來,是因為當mid * mid大於x的時候,賦值right應該是mid- 1,而不是mid,因為它是向下取整的,所以是mid-1一定是小於等於開方數字的,其次就是二分的時候向右取一位,再就是要用longlong型別,否則會溢位。

class solution 

return left;}};

這個題,暈暈的,到底left和right和mid到底應該如何賦值呢,right肯定是size - 1,mid啥時候是向右啥時候向左呢,上乙個題是向右取得,這個題就是向左取得,這個題是left 是mid + 1,上乙個題是right 賦值為mid - 1,

所以目前來看,應該是mid向右取,那就right是mid - 1, 如果mid向左取,那就是left是mid + 1

class solution 

return letters[left]; }};

這個題也是墨跡了好久啊,都怪自己沒想清楚,反正就是二分的條件一般都是left然後覺得如果中間的數和左邊相等,那單獨的數字就在左邊,如果中間的數和右邊相等(left = mid + 2),那單獨的數字就在右邊.

但其實這是mid是奇數個時候,如果mid是偶數個時候,也就是兩邊是奇數的時候,那mid和左邊相等,單獨的數就在右邊(left = mid + 1),mid和右邊相等,那單獨的數就在左邊。

而且對left和right重新賦值的時候也要想清楚,這裡主要是考慮只要把對應的已經確定不是單獨數字的那個給跳過去就好了,所以這裡有乙個加2和減2的過程。

class solution 

return nums[left]; }};

這是乙個單純的二分查詢的題目,所以應該就是mid如果是往左的,那就是左邊是mid + 1,如果是往右的,那右邊就是mid - 1,並且這個更新左邊還是更新右邊有1,要看具體情況,比如這個題,mid如果是錯誤的,那這個mid有可能是第乙個錯誤版本,那就需要在下一次迴圈中考慮上它,但是如果mid不是錯誤的,那它一定不是第乙個錯誤版本,那就不需要再下一次迴圈中考慮上它。

// forward declaration of isbadversion api.

bool isbadversion(int version);

class solution

return left;}};

這個題其實和之前做的33題 搜尋旋轉排序陣列 很像,所以一定是可以用二分來查詢的。

方法一:遍歷陣列,時間複雜度是o(n)

class solution 

return minval;}};

方法二:類二分法查詢

找到中間位置,如果中間位置小於第乙個數字,那就說明前半部分包含旋轉部分,那最小值一定在前半部分,也就是更新right的值。

如果中間位置數字大於第乙個數,這說明前半部分有序,後半部分的情況是不確定的,如果後半部分也是有序的,那最小值就是第乙個left位置的值,否則的話最小值應該是出現在後半部分無序的部分中。

因此,這時候要比較num[right]和mid的值大小,如果nums[right] > nums[mid],說明後半部分有序,這時候nums[left]就是最小值。否則的話,應該去後半部分尋找最小值,也就是更新left的值。

class solution 

return nums[left];}};

這個題的思路不難,但是我二分的邊界條件老找不准,看來如果left和right同時對1操作,那迴圈條件就變成了有可能相等了。

class solution 

}return res; }};

這個題,,,我雖然ac了,但我也不知道自己在寫啥東西了,,就是根據測試樣例,才能夠想到那些邊界情況,要是直接白板寫感覺根本搞不定

class solution 

else left = temp;}}

return nums[left];}};

看了乙個大神的思路,感覺太膩害了,,它這個就是嚴格的二分,而我原來那些其實都不是嚴格的二分,我是在找遞增的區間,然後直接返回最左邊的值。

力扣​leetcode-cn.com

要找的是第二個陣列的首個元素,所以nums[mid]就和num[right]進行比較,

nums[mid] > num[right] ,說明旋轉點在右邊,更新left = mid + 1

nums[mid] < num[right],說明要麼旋轉點在左邊,要麼旋轉點就是mid,所以更新right = mid

當二者相等的時候,就更新right = right - 1

class solution 

return nums[left];}};

二分法查詢是基於有序 python實現二分查詢演算法

二分查詢演算法,是常見的搜尋演算法之一,適用於有序的序列,通過將序列不斷的對折分為區間,從而確定查詢值是否存在,優點是速度快。首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將表分成前 後兩個子表,如果中間位置記錄的關鍵字大於...

二分法查詢是基於有序 201,查詢順序查詢

查詢演算法中順序查詢算是最簡單的了,無論是有序的還是無序的都可以,也不需要排序,只需要乙個個對比即可,但其實效率很低。我們來看下 1public static int search1 int a,int key 6 return 1 7 如果找到就返回查詢的數所在陣列中的下標,如果沒找到就返回 1。...

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...