二分算法(模板)

例題1:

704. 二分查找 - 力扣(LeetCode)

算法原理:(二分)

通過遍歷也可以通過,但是二分更優且數據量越大越能體現。

二分思路:

1.mid1 = ?(left + right)/2 與?mid2 = right +?(right - left)/2區別。

如果不考慮數據范圍:?(left + right)/2? =?right +?(right - left)/2,但越界就不一樣了。

mid1 = ?(left + right)/2?:可能越界

mid2 = left+?(right - left)/2 : 可以防止越界

2.mid1 = (right +?left)/2 與?mid2 = (right +?left + 1)/2區別。

(right +?left)/2? : 向下取整

(right +?left + 1)/2 :向上取整

舉個例子: right = 3,left = 4,(right +?left)/2? = 3,(right +?left + 1)/2 = 4;

? ? ? ? ? ? ? ? ? ?right = 2,left = 4,(right +?left)/2? = 3,(right +?left + 1)/2 = 3;

這里不會嚴格用數學方式去證明,那樣太花時間了,感興趣的話網上搜搜,我們直接給出結論,當right +?left 結果為偶數時,mid1 與 mid2 是沒有區別的,但結果為奇數時就會相差1,不要小看了這一點區別,不注意這里,就很有可能寫出死循環,具體我們在下面例題里體現。

這里不能通過調整上下取整的方式來避免死循環。但是可以通過增加一行代碼來弄

(? ? ? ?if(left == right && nums[left] != target) break;? ? ? )

代碼:

//暴力可以過😯public int search(int[] nums, int target) {int n = nums.length;for(int i = 0;i < n;i++){if(nums[i] > target){break;}if(nums[i] == target) return i;}return -1;}
     //二分public int search(int[] nums, int target) {int left = 0;int right = nums.length - 1;while(left <= right){int mid = left + (right - left)/2;if(nums[mid] < target){left = mid+1;}else if(nums[mid] ==target){return mid;}else {right = mid-1;}}return -1;}
//二分,調整后public int search(int[] nums, int target) {int left = 0;int right = nums.length - 1;while(left <= right){int mid = left + (right - left)/2;if(nums[mid] < target){left = mid+1;}else if(nums[mid] ==target){return mid;}else {right = mid;}if(left == right && nums[left] != target) break; }return -1;}

?

通過上面兩幅幅圖我們就可以感受到上,下取整差1,如果調整不好便會出現死循環。這里只列舉了向下取整,避免死循環情況。還有一種是向上取整,避免死循環情況。(再往下的例題就不會,所這么多了。)?

如下例題都是可以利用二分解決的,這里就提一點,二分的使用場景并不一定非要整個序列有序,而是依據你的需求,巧妙的去使用它。

例題2:

34. 在排序數組中查找元素的第一個和最后一個位置 - 力扣(LeetCode)

例題3:

162. 尋找峰值 - 力扣(LeetCode)

例題4:

153. 尋找旋轉排序數組中的最小值 - 力扣(LeetCode)

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

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

相關文章

VUE3 學習筆記2 computed、watch、生命周期、hooks、其他組合式API

computed 計算屬性在vue3中&#xff0c;雖然也能寫vue2的computed&#xff0c;但還是更推薦使用vue3語法的computed。在Vue3中&#xff0c;計算屬性是組合式API&#xff0c;要想使用computed&#xff0c;需要先對computed進行引入&#xff1a;import { computed } from vuecomp…

【java面試day13】mysql-定位慢查詢

文章目錄問題&#x1f4ac; Question 1相關知識問題 &#x1f4ac; Question 1 Q&#xff1a;這條sql語句執行很慢&#xff0c;你如何分析呢&#xff1f; A&#xff1a;當一條 SQL 執行較慢時&#xff0c;可以先使用 EXPLAIN 查看執行計劃&#xff0c;通過 key 和 key_len 判…

3分鐘解鎖網頁“硬盤“能力:離線運行VSCode的新一代Web存儲技術

Hi&#xff0c;我是前端人類學&#xff08;之前叫布蘭妮甜&#xff09;&#xff01; “這不是瀏覽器&#xff0c;這是裝了個硬盤。” —— 用戶對現代Web應用能力的驚嘆 隨著Origin Private File System和IndexedDB Stream等新技術的出現&#xff0c;Web應用現在可以在用戶的設…

LT6911GXD,HD-DVI2.1/DP1.4a/Type-C 轉 Dual-port MIPI/LVDS with Audio 帶音頻

簡介LT6911GXD是一款高性能HD-DVI2.1/DP1.4a/Type-c轉Dual-port MIPI/LVDS芯片&#xff0c;兼容 HDMI2.1、HDMI2.0b、HDMI1.4、DVI1.0、DisplayPort 1.4a、eDP1.4b 等多種視頻接口標準。支持4K(38402160)60Hz的DSC直通。應用場景AR/VR設備LT6911GXD 支持高達 4K&#xff08;384…

【100頁PPT】數字化轉型某著名企業集團信息化頂層規劃方案(附下載方式)

篇幅所限&#xff0c;本文只提供部分資料內容&#xff0c;完整資料請看下面鏈接 https://download.csdn.net/download/2501_92808811/91662628 資料解讀&#xff1a;數字化轉型某著名企業集團信息化頂層規劃方案 詳細資料請看本解讀文章的最后內容 作為企業數字化轉型領域的…

高精度標準鋼卷尺優質廠家、選購建議

高精度標準鋼卷尺的優質廠家通常具備精湛工藝與權威精度認證等特征&#xff0c;能為產品質量提供保障。其選購需兼顧精度標識、使用場景、結構細節等多方面&#xff0c;具體介紹如下&#xff1a;一、高精度標準鋼卷尺優質廠家**1、河南普天同創&#xff1a;**PTTC-C5標準鋼卷尺…

38 C++ STL模板庫7-迭代器

C STL模板庫7-迭代器 文章目錄C STL模板庫7-迭代器一、迭代器的核心作用二、迭代器的五大分類與操作三、關鍵用法與代碼示例1. 迭代器的原理2. 迭代器用法與示例3. 迭代工具用法示例4. 使用技巧迭代器是C中連接容器與算法的通用接口&#xff0c;提供了一種訪問容器元素的統一方…

【0基礎3ds Max】學習計劃

3ds Max 作為一款功能強大的專業 3D 計算機圖形軟件&#xff0c;在影視動畫、游戲開發、建筑可視化、產品設計和工業設計等眾多領域有著廣泛的應用。 目錄前言一、第一階段&#xff1a;基礎認知&#xff08;第 1 - 2 周&#xff09;?二、第二階段&#xff1a;建模技術學習&…

用 Enigma Virtual Box 將 Qt 程序打包成單 exe

上一篇介紹了用windeployqt生成可運行的多文件程序,但一堆文件分發起來不夠方便。有沒有辦法將所有文件合并成一個 exe? 答案是肯定的 用Enigma Virtual Box工具就能實現。本文就來講解如何用它將 Qt 多文件程序打包為單一 exe,讓分發更輕松。 其中的 一定要選 第二個 一…

【LeetCode 熱題 100】45. 跳躍游戲 II

Problem: 45. 跳躍游戲 II 給定一個長度為 n 的 0 索引整數數組 nums。初始位置為 nums[0]。 每個元素 nums[i] 表示從索引 i 向后跳轉的最大長度。換句話說&#xff0c;如果你在索引 i 處&#xff0c;你可以跳轉到任意 (i j) 處&#xff1a; 0 < j < nums[i] 且 i j &…

池式管理之線程池

1.初識線程池問&#xff1a;線程池是什么&#xff1f;答&#xff1a;維持管理一定數量的線程的池式結構。&#xff08;維持&#xff1a;線程復用 。 管理&#xff1a;沒有收到任務的線程處于阻塞休眠狀態不參與cpu調度 。一定數量&#xff1a;數量太多的線程會給操作系統帶來線…

嬰兒 3D 安睡系統專利拆解:搭扣與智能系帶的鎖定機制及松緊調節原理

凌晨2點&#xff0c;你盯著嬰兒床里的小肉團直嘆氣。剛用襁褓裹成小粽子才哄睡的寶寶&#xff0c;才半小時就蹬開了裹布&#xff0c;小胳膊支棱得像只小考拉&#xff1b;你手忙腳亂想重新裹緊&#xff0c;結果越裹越松&#xff0c;裹布滑到脖子邊&#xff0c;寶寶突然一個翻身&…

pandas中df.to _dict(orient=‘records‘)方法的作用和場景說明

df.to _dict(orientrecords) 是 Pandas DataFrame 的一個方法&#xff0c;用于將數據轉換為字典列表格式。以下是詳細解釋及實例說明&#xff1a; 一、核心含義作用 將 DataFrame 的每一行轉換為一個字典&#xff0c;所有字典組成一個列表。 每個字典的鍵&#xff08;key&#…

阿里云Anolis OS 8.6的公有云倉庫源配置步驟

文章目錄一、備份現有倉庫配置&#xff08;防止誤操作&#xff09;二、配置阿里云鏡像源2.1 修改 BaseOS 倉庫2.2 修改 AppStream 倉庫三、清理并重建緩存四、驗證配置4.1 ?檢查倉庫狀態?&#xff1a;五、常見問題解決5.1 ?HTTP 404 錯誤5.2 ?網絡連接問題附&#xff1a;其…

回歸預測 | Matlab實現CNN-BiLSTM-self-Attention多變量回歸預測

回歸預測 | Matlab實現CNN-BiLSTM-self-Attention多變量回歸預測 目錄回歸預測 | Matlab實現CNN-BiLSTM-self-Attention多變量回歸預測預測效果基本介紹程序設計參考資料預測效果 基本介紹 1.Matlab實現CNN-BiLSTM融合自注意力機制多變量回歸預測&#xff0c;CNN-BiLSTM-self-…

103、【OS】【Nuttx】【周邊】文檔構建渲染:Sphinx 配置文件

【聲明】本博客所有內容均為個人業余時間創作&#xff0c;所述技術案例均來自公開開源項目&#xff08;如Github&#xff0c;Apache基金會&#xff09;&#xff0c;不涉及任何企業機密或未公開技術&#xff0c;如有侵權請聯系刪除 背景 接之前 blog 【OS】【Nuttx】【周邊】文…

轉換一個python項目到moonbit,碰到報錯輸出:編譯器對workflow.mbt文件中的類方法要求不一致的類型注解,導致無法正常編譯

先上結論&#xff1a;現在是moon test的時候有很多報錯&#xff0c;消不掉。問題在Trae中用GLM-4.5模型&#xff0c;轉換一個python項目到moonbit&#xff0c;碰到報錯輸出&#xff1a;報錯輸出經過多次嘗試修復&#xff0c;我發現這是一個MoonBit編譯器的bug。編譯器對workflo…

【C#補全計劃】事件

一、事件的概念1. 事件是基于委托的存在&#xff0c;是委托的安全包裹&#xff0c;讓委托的使用更具有安全性2. 事件是一種特殊的變量類型二、事件的使用1. 語法&#xff1a;event 委托類型 事件名;2. 使用&#xff1a;&#xff08;1&#xff09;事件是作為成員變量存在與類中&…

java內存緩存

我們在項目中會經常使Redis和Memcache,但是簡單項目就沒必要使用專門的緩存框架來增加系統的復雜性。用Java代碼邏輯就能實現內存級別的緩存。1.定時任務線程池使用ScheduledExecutorService結合ConcurrentHashMap&#xff0c;如果你使用的是ConcurrentHashMap&#xff0c;你可…

智能工廠生產監控大屏-vue純前端靜態頁面練習

學習前端還是非常有意思的&#xff0c;因為前端真的是可見即所得&#xff0c;可以做出來非常好看漂亮的頁面&#xff0c;最近我就在使用前端技術 做一些大屏報表&#xff0c;在制作這些大屏報表過程中&#xff0c;又熟練的練習了自己的學到的相關的前端技術&#xff0c;接下來把…