算法學習筆記——二分搜索

二分搜索

在有序數組中確定num存在還是不存在:

  • arr[m] == num,則num存在
  • arr[m] > num,則 r = m - 1,縮小r的范圍,繼續往左二分
  • arr[m] < num,則l = m + 1,縮小l的范圍,繼續往右二分
// 保證arr有序,才能用這個方法
public static boolen exist(int[] arr, int num) {if (arr == null || arr.length == 0){return false;}int l = 0, r = arr.length - 1, m = 0;while (l <= r) {// 中間值m = l + ((r - l) >> 1);if (arr[m] == num) {// 中間值 == num,直接返回結果return true;} else if (arr[m] > num) {// 中間值 > num,縮小r的范圍r = m - 1;} else {// 中間值 < num, 縮小l的范圍l = m + 1;}}return false;
}

有序數組中找>=num的最左位置:

  • ans(二分搜索法答案) 初始值設置為:-1,-1表示不存在符合要求的值
  • middle(中點值) >= num 時修改ans = middle 并 r = middle - 1 縮小右邊范圍,繼續往左二分
  • middle(中點值) < num 時 不修改 ans 但 l = middle + 1 縮小左邊范圍 ,繼續往右二分
  • 求中間值公式用:l + ((r - l) >> 1) 或者 l + ((r - 1) / 2),防止運算數值溢出
  • 找<=num的最左位置沒有意義,直接找下標為0的位置進行判斷就可以得出結果
// 保證arr有序,才能用這個方法
// 有序數組中找>=num的最左位置
public static int findLeft(int[] arr, int num) {int l = 0, r = arr.length - 1, m = 0;int ans = -1;while (l <= r){m = l + ((r - l) >> 1); // 等于 l + ((r - 1) / 2), 等于 (l + r) / 2if (arr[m] >= num) {ans = m;r = m - 1;} else {l = m + 1;}}return ans;
}

在有序數組中找<=num的最右位置:

  • ans(二分搜索法答案) 初始值設置為:-1,-1表示不存在符合要求的值
  • middle(中點值) <= num 時修改ans = middle 并 l = middle + 1 縮小右邊范圍,繼續往右二分
  • middle(中點值) > num 時 不修改 ans 但 r = middle - 1 縮小左邊范圍 ,繼續往左二分
  • 求中間值公式用:l + ((r - l) >> 1) 或者 l + ((r - 1) / 2),防止運算數值溢出
// 保證arr有序,才能用這個方法
// 有序數組中找<=num的最右位置
public static int findLeft(int[] arr, int num) {int l = 0, r = arr.length - 1, m = 0;int ans = -1;while (l <= r){m = l + ((r - l) >> 1); // 等于 l + ((r - 1) / 2), 等于 (l + r) / 2if (arr[m] <= num) {ans = m;l = m + 1;} else {r = m - 1;}}return ans;
}

二分搜索不一定發生在有序數組上(比如尋找峰值問題):

  • 峰值:i-1 < i > i+1,則i為峰值,如果右邊或者左邊沒數值可以認為是無窮小

  • 數組條件:數組中相鄰的兩個數不相等, 只返回一個峰值就行

  • 0位置不是峰值,N-1位置不是峰值,則呈現左邊上揚右邊下降的趨勢,這中間會出現一個或者多個峰值

  • 計算步驟:

    1. 先判斷數組[0]是不是峰值,是則直接返回
    2. 再判斷數組[N-1]是不是峰值,是則直接返回
    3. 設置 L = 1,R = N-2,求中間值,如果中間值是峰值則直接返回
    4. 判斷中間值的大小,當左側數值>中間值,往左側二分,而右側數值>中間值,往右側二分,如果兩個都成立選其中一個就行
    // 峰值元素是指其嚴格大于左右相鄰值的元素
    // 給你一個整數數組 nums,已知任何兩個相鄰的值都不相等
    // 找到峰值元素并返回其索引
    // 數組可能包含多個峰值,在這種情況下,返回任何一個峰值 所在位置即可
    // 你可以假設 nums[-1] = nums[n] = 無窮小
    // 你必須實現時間復雜度為 0(log n) 的算法來解決此問題
    public static int findPeakElement(int[] arr) {int n = arr.length;// 小   小// -1 0 1if (arr.length == 1) {return 0;}// 數組長度 >= 2// 單獨驗證0位置,是不是峰值點if (arr[0] > arr[1]) {return 0;}//  單獨驗證n-1位置,是不是峰值點if (arr[n - 1] > arr[n - 2]) {return n - 1;}// X   中間一定有一個峰值    X// 0                      N-1// 中間 :1 ~ n-2 ,一定有峰值點// 每一步的l...r : 一定有峰值點int l = 1, r = n - 2, m = 0, ans = -1;while (l <= r) {m = l + ((r - l) >> 1);if (arr[m - 1] > arr[m]) {r = m - 1;} else if (arr[m] < arr[m + 1]) {l = m + 1;} else {ans = m;break;}}return ans;
    }
    

某側必有對應的值或者某側必沒有對應的值,則可以使用二分搜索法

如果數組長度為n,那么二分搜索搜索次數是log n次,以2為底

二分搜索世界復雜度o(log n)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24700.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24700.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24700.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android基礎-進程間通信

在Android系統中&#xff0c;跨進程通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;是實現不同應用程序或同一應用程序中不同進程間數據共享和交互的關鍵技術。Android提供了多種IPC機制&#xff0c;每種機制都有其特定的使用場景和優缺點。下面將詳細…

代碼隨想錄算法訓練營第36期DAY51

DAY51 121買賣股票的最佳時機 做過了。算是二刷&#xff1a;來自力扣優質題解 貪心&#xff1a; 每次記錄更新最小點和最大出售值。 class Solution {public: int maxProfit(vector<int>& prices) { int cur,resINT_MIN,curminINT_MAX; for(int…

從軍事角度理解“戰略與戰術”

戰略與戰術&#xff0c;均源于軍事術語。 戰略&#xff08;Strategy&#xff09;&#xff0c;源自希臘語詞匯“strategos&#xff08;將軍&#xff09;”和“strategia&#xff08;軍事指揮部&#xff0c;即將軍的辦公室和技能&#xff09;”。指的是指揮全局性作戰規劃的謀略…

【位運算】【前綴和】個人練習-Leetcode-1177. Can Make Palindrome from Substring

題目鏈接&#xff1a;https://leetcode.cn/problems/can-make-palindrome-from-substring/description/ 題目大意&#xff1a;給出一個字符串s&#xff0c;每次query給出l, r, k&#xff0c;要求判斷子串s[l:r1]在經過k次操作后是否能變為回文串。一次操作可以將子串內的一個字…

mysql 數據庫在liunx 上的備份和恢復

一. mysql 數據庫備份 sh 腳本 1. vim sqlback.sh #!/bin/bashUSER"root" #賬號 PASSWORD"123456" #密碼 DATABASE"test" #數據庫名 BACKUP_DIR"/home/dev/mysql" #備份存的目錄 TIMESTAMP$(date "%F") …

搭建python虛擬環境,并在VSCode中使用

創建環境 python -m venv E:\python\flask\venv激活環境 運行下圖所示的bat文件 退出環境 執行下面的語句 deactivateVSCode中配置&#xff1a; ①使用CTRLshiftp命令&#xff0c;使用CTRLshiftp命令&#xff0c;輸入&#xff1a; Python: Select Interpreter②選擇之前創建…

【計算視覺】學習計算機視覺你不得不膜拜的CVPR大神:何凱明

目錄 第一章&#xff1a;CVPR——計算機視覺的終極擂臺 第二章&#xff1a;何凱明——計算機視覺領域的耀眼星辰 第三章&#xff1a;高引用論文——計算機視覺研究的璀璨星辰 第四章&#xff1a;何凱明的CVPR論文——深度學習的探索之旅 第五章&#xff1a;結語——向何凱…

翻譯《The Old New Thing》- Why isn’t there a SendThreadMessage function?

Why isnt there a SendThreadMessage function? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20081223-00/?p19743 Raymond Chen 2008年12月23日 為什么沒有 SendThreadMessage 函數&#xff1f; 簡要 文章討論了 Windows 中不存在 Sen…

WHAT - 發布訂閱

目錄 一、常見實現方案1.1 使用事件發射器&#xff08;Event Emitter&#xff09;1.2 自定義事件系統&#xff08;EventBus&#xff09;1.3 使用庫如 PubSubJS1.4 使用框架內置的狀態管理工具Vue.jsReact (使用 Context API 或 Redux) 二、先后關系2.1 緩存事件數據2.2 使用 Re…

React hooks動態配置側邊欄

React hooks根據不同需求 還有不同的角色 動態的去配置側邊欄 需求&#xff1a; 點擊某個按鈕是一套側邊欄 &#xff0c;不同角色&#xff08;比如管理員之類的權限高一點&#xff09;比普通用戶多個側邊欄 然后點擊另一個按鈕是另一套側邊欄 此時&#xff0c;就需要動態的去…

【React】classnames 優化類名控制

1. 介紹 classnames是一個簡單的JS庫&#xff0c;可以非常方便的通過條件動態的控制class類名的顯示 ClassNames是一個用于有條件處理classname字符串連接的庫 簡單來說就是動態地去操作類名&#xff0c;把符合條件的類名粘在一起 現在的問題&#xff1a;字符串的拼接方式不…

KMeans聚類分析星

1. datasample initial_centroids datasample(data, k, Replace, false); 是MATLAB中的命令&#xff0c;用于從數據集data中隨機抽取k個樣本作為初始聚類匯總新&#xff0c;并且抽取時不放回。 datasample&#xff1a;是MATLAB中的函數&#xff0c;用于從數組中隨機抽取樣本d…

halcon算子之prepare_object_model_3d詳解

為某一操作準備三維對象模型。 Description 操作符prepare_object_model_3d準備3D對象模型ObjectModel3D,用于下面目的中給出的操作。它計算操作所需的值并將其存儲在ObjectModel3D中,從而加快了后續操作。沒有必要調用prepare_object_model_3d。但是,如果要多次使用3D對象…

5、js關于數組的常用方法(19種)

一、改變原數組的方法 1.push&#xff08;&#xff09; 末尾添加數據 語法&#xff1a; arr.push(要插入的數據可以多個) // push 尾部添加數據const arr [1,2,3,4,5];arr.push(6,7);console.log(arr);//(7) [1, 2, 3, 4, 5, 6, 7]2. pop&#xff08;&#xff09; 末尾刪除一…

大疆智圖_空三二維重建成果傳輸

一、軟件環境 1.1 所需軟件 1、 大疆智圖&#xff1a;點擊下載&#xff1b; ??2、 ArcGIS Pro 3.1.5&#xff1a;點擊下載&#xff0c;建議使用IDM或Aria2等多線程下載器&#xff1b; ??3、 IDM下載器&#xff1a;點擊下載&#xff0c;或自行搜索&#xff1b; ??4、 Fas…

探索 Noisee AI 的奇妙世界與變現之旅

日賺800&#xff0c;利用淘寶/閑魚進行AI音樂售賣實操 如何讓AI生成自己喜歡的歌曲-AI音樂創作的正確方式 抖音主播/電商人員有福了&#xff0c;利用Suno創作產品宣傳&#xff0c;讓產品動起來-小米Su7 用sunoAI寫粵語歌的方法&#xff0c;博主已經親自實踐可行 五音不全也…

[經驗] 潿洲島在廣西嗎 #職場發展#知識分享#媒體

潿洲島在廣西嗎 廣西潿洲島&#xff0c;是中國南海上的一顆閃亮明珠&#xff0c;位于廣西北部灣沿海&#xff0c;東經108.71度&#xff0c;北緯21.54度&#xff0c;距離北海市區30公里&#xff0c;是中國最大的海島之一&#xff0c;風景秀麗&#xff0c;氣候溫和。島上山青水秀…

!力扣3. 無重復字符的最長子串

給定一個字符串 s &#xff0c;請你找出其中不含有重復字符的 最長子串的長度。 示例 1: 輸入: s "abcabcbb" 輸出: 3 解釋: 因為無重復字符的最長子串是"abc"&#xff0c;所以其長度為 3 示例 2: 輸入: s "bbbbb" 輸出: 1 …

PCE自動裝機

服務端和客戶端 pxe&#xff1a;c/s模式&#xff0c;允許客戶端通過遠程服務器(服務端)下載引導鏡像&#xff0c;加載安裝吻技安&#xff0c;實現自動化安裝操作系統。 無人值守&#xff1a;安裝選項不需要認為干預&#xff0c;可以自動化實現。 pxe優點&#xff1a; 1.規模…

Overall timing accuracy 和Edge placement accuracy 理解

在電子設計自動化(EDA)、集成電路(IC)制造和高速數字電路設計領域,"Overall Timing Accuracy" 和 "Edge Placement Accuracy" 是兩個關鍵的性能指標,它們對于確保電路的功能正確性和性能至關重要。 當涉及到“Overall timing accuracy”(總體時序精度)…