【基礎算法】二分查找的多種寫法

前言

????????在算法競賽中,二分查找使用的頻率是非常高的,對于C++選手而言,有STL中自帶的lower_bound和upper_bound二分查找,可以很方便的進行二分查找。但是非C++選手、或者需要自定義多條件查找的情況需要自己寫一個二分,本文對幾種常見的二分查找寫法進行講解。

????????本文使用的編程語言為Java,但代碼比較好理解其他語言選手也可以查看本文來學習二分相關內容。


二分查找

????????二分查找,也稱折半查找,是一種可以在有序序列上進行快速查找的算法,時間復雜度是O(logn)

????????常見的二分查找類型,有以下兩種:

  • 查找目標值在序列中不小于目標值的第一個元素(同lower_bound,以此查到第一個位置)。

  • 查找目標值在序列中第一個大于目標值的元素(同upper_bound,以此查找到最后一個出現的位置)。

????????在設置區間的時候,根據寫法的不同分為下面幾種:

  • 左閉右閉。

  • 左閉右開。

????????根據最終獲取答案的寫法,又分為下面兩種:

  • 在左右指針處取值。

  • 設置額外變量取值。

????????本文將分不同情況,寫出不同情況下的二分查找模板,幫助大家理解學習。


查找目標值在序列中不小于目標值的第一個元素

????????也就是實現一個STL中的lower_bound。

左閉右閉版

/*** [l,r]左閉右閉區間 lower_bound* @param nums 遞增序列* @param target 目標值* @return 返回不小于目標值的第一個元素下標*/
int lowBs(int[] nums,int target){int l=0;int r=nums.length-1;while(l<=r){int mid=l+(r-l>>1);if(nums[mid]<target){l=mid+1;}else{r=mid-1;}}return l;
}

左閉右開版

/*** [l,r)左閉右閉區間 lower_bound* @param nums 遞增序列* @param target 目標值* @return 返回不小于目標值的第一個元素下標*/
int lowBs(int[] nums,int target){int l=0;int r=nums.length;while(l<r){int mid=l+(r-l>>1);if(nums[mid]<target){l=mid+1;}else{r=mid;}}return l;
}

查找目標值在序列中第一個大于目標值的元素

????????也就是實現一個STL中的upper_bound。

左閉右閉版

/***  [l,r]左閉右閉 upper_bound* @param arr 遞增序列* @param target 目標值* @return 返回第一個大于目標值的位置*/
int highBs(int[] arr,int target){int l=0;int r=arr.length - 1;while(l<=r){int mid=l+(r-l>>1);if(arr[mid]<=target){l=mid+1;}else{r=mid-1;}}return l;
}

左閉右開版

/***  [l,r)左閉右開 upper_bound* @param arr 遞增序列* @param target 目標值* @return 返回第一個大于目標值的位置*/
int highBs(int[] arr,int target){int l=0;int r=arr.length;while(l<r){int mid=l+(r-l>>1);if(arr[mid]<=target){l=mid+1;}else{r=mid;}}return l;
}

易錯問題和常見問題總結

一、需要注意區間定義和終止條件是否匹配正確

  • 左閉右閉:初始化 r = nums.length-1,終止條件 while (l <= r)

  • 左閉右開:初始化 r = nums.length,終止條件 while (l < r)

二、指針更新是否正確

  • 左閉右閉:r = mid - 1l = mid + 1

  • 左閉右開:r = mid

三、運算符優先級

????????應寫為:int mid = l + ( r - l >> 1)

?為什么不能寫為 l + r >> 1

????????如果可以保證l+r不會溢出的話,其實這樣寫也可以,但是為了保證不出現數據溢出,更加推薦寫上面的形式。

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

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

相關文章

蘭亭妙微:火箭發射界面案例分享

北京藍藍設計團隊來自清華美院&#xff0c;工作多年&#xff0c;行業經驗豐富&#xff0c;專業性很強。我們是熱愛設計&#xff0c;設計不僅是我們的專業&#xff0c;我們的職業&#xff0c;還是我們的愛好。每一個藍藍設計的設計師都希望自己的設計越來越好&#xff0c;以高標…

完美解決.NET Framework 4.0 中 System.Drawing 庫不支持 WebP 格式的圖像處理

如果你想在 .NET Framework 4.0 中使用 ImageMagick 處理圖片&#xff0c;可以通過 Magick.NET 庫來實現。Magick.NET 是 ImageMagick 的 .NET 封裝&#xff0c;可以用來讀取、寫入、編輯圖像。 以下是如何使用 Magick.NET 來處理圖像并提取圖像的寬度和高度。 步驟&#xff…

string--OJ1

鏈接: 例一 鏈接: 例er class Solution { public:int myAtoi(string str) {int sign 1;int ret0;int i0;while(str[i] ){i;}if(str[i]||str[i]-){if(str[i]-)sign*-1;i;}while(str[i]>0&&str[i]<9){int rstr[i] - 0;if(ret>INT_MAX/10||(retINT_MAX/10&…

Go 寫一個簡單的Get和Post請求服務

Go 寫一個簡單的Get和Post請求服務 ? 一、準備工作 安裝 Go 官網下載地址 安裝后執行&#xff1a; go version安裝 VS Code 插件 在 VS Code 插件市場搜索并安裝插件&#xff1a;Go&#xff08;由 Go 團隊提供&#xff09; 配置環境變量&#xff08;可選&#xff09; 設置 …

哪些因素會影響遠程視頻監控的質量?淺述EasyCVR視頻智能診斷技術

在安防領域&#xff0c;無線監控系統憑借其靈活部署、便捷擴展的特性得到廣泛應用。然而&#xff0c;實時監控圖像清晰度不足、回放調查受限等問題&#xff0c;嚴重制約了其應用效果。經分析&#xff0c;攝像機性能、線纜質量、無線網橋性能、交換機配置及供電電壓等是影響圖像…

Java大師成長計劃之第10天:鎖與原子操作

&#x1f4e2; 友情提示&#xff1a; 本文由銀河易創AI&#xff08;https://ai.eaigx.com&#xff09;平臺gpt-4o-mini模型輔助創作完成&#xff0c;旨在提供靈感參考與技術分享&#xff0c;文中關鍵數據、代碼與結論建議通過官方渠道驗證。 在多線程編程中&#xff0c;鎖與原子…

線性代數——行列式?

目錄 一、行列式的定義? 1-1、三階行列式練習 1-2、下面介紹下三角行列式、上三角行列式、對角行列式 ?編輯 二、行列式的性質 2-1、性質1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6 ?編輯 2-2、性質7 2- 3、拉普拉斯定理、克萊姆法則 三…

微軟推出數款Phi 4“開放式”人工智能模型

微軟周三推出了幾款新的“開放式”人工智能模型&#xff0c;其中功能最強大的模型至少在一個基準測試上可與 OpenAI 的 o3-mini 相媲美。所有新的授權模型——Phi 4 mini reasoning、Phi 4 reasoning 和 Phi 4 reasoning plus——都是“推理”模型&#xff0c;這意味著它們能夠…

VPN訪問SAP組服務器報登陸負載均衡錯誤88:無法連接到消息服務器(RC=9)

用戶反饋用SAPGUI接入SAP時報錯&#xff1a;登陸負載均衡錯誤88&#xff1a;無法連接到消息服務器(RC9) 經了解是通過VPN訪問&#xff0c;但VPN沒有放行ICMP訪問&#xff0c;導致不能PING通&#xff0c;不能確認是網絡問題還是什么問題。 解決方案&#xff1a; 1、VPN由原&am…

使用AI-01開發板和開源后端服務搭建整套小智服務系統

使用AI-01開發板和開源后端服務搭建整套小智服務系統 四博智聯的AI-01開發板&#xff0c;基于樂鑫ESP32-C2 專屬定制的離線語音模組&#xff0c;能夠完美的接入小智AI服務平臺&#xff0c;再使用開源后端服務&#xff0c;就能夠搭建一個完整的小智AI服務系統了。 下面是具體…

字節跳動在GitHub上有哪些開源項目

字節跳動&#xff08;ByteDance&#xff09;在GitHub上開源了許多項目&#xff0c;涵蓋前端、后端、云原生、AI、數據庫等多個領域。以下是一些典型項目及其簡介&#xff1a; 1. 前端 & 跨平臺開發 Hippy 倉庫: Tencent/Hippy&#xff08;注&#xff1a;Hippy 最初由騰訊開…

超長8分鐘Suno V4.5 – 支持一首歌多風格轉換啦~~~

f歷史文章 Suno AI API接入 - 將AI音樂接入到自己的產品中&#xff0c;支持120并發任務 AI音樂支持中文&#xff0c;實測效果&#xff0c;大家自己聽聽看嘍 2025年新年快樂&#xff0c;Viggle AI打開新年快樂 讓照片舞動起來&#xff0c;只要3分鐘就可以搞定了&#xff0c;…

vue3+ts項目 配置vue-router

安裝vue-router pnpm install vue-router配置 1.src/router/index.ts文件下的內容 import type { App } from vue import type { RouteRecordRaw } from vue-router import { createRouter, createWebHistory } from vue-router import remainingRouter from ./modules/remai…

如何利用dify 生成Fine?tune 需要的Alpaca 格式數據

如果你選擇llamafactory 格式進行微調&#xff0c;它只是格式是Alpaca格式&#xff0c;dify 的agent dsl 如下&#xff0c;你可以導入本地的dify 或者導入cloud 版本的&#xff1b;測試版本是0.1.5 app:description: 上傳文件&#xff0c;基于文件內容&#xff0c;使用 Silico…

C++開發指南

一、C++ 是什么? C++ 是一種強大、靈活、高性能的系統級編程語言,由 Bjarne Stroustrup 在 20 世紀 80 年代初開發,是 C 語言的超集。它既支持面向過程編程,也支持面向對象、泛型、函數式等現代范式。 C++ 被廣泛應用于: 系統軟件(如操作系統、編譯器)游戲開發(如 Un…

重測序關系矩陣構建方式匯總

樣本間親緣關系矩陣&#xff08;kinship matrix&#xff09;和同源性矩陣&#xff08;IBS matrix&#xff09;構建的方式 1. 可以使用plink的–make-rel計算個體之間的親緣關系&#xff08;強調個體之間的遺傳相似性&#xff09; /opt/software/plink --bfile vcf_bfile--mak…

docker 部署前、后端分離項目詳細步驟(從打包到部署)

在平常的開發工作中&#xff0c;一個項目經歷需求、開發、測試、上線等步驟。在開發測試完成后&#xff0c;我們需要部署測試環境、生產環境等&#xff0c;那么我們用 docker 方式應該怎么部署呢&#xff1f;前后端分離的項目又該如何部署呢&#xff1f;那么&#xff0c;今天我…

大語言模型理解一般需求到在專業領域中最大限度地發揮其效能的演變軌跡

在人工智能技術飛速發展的當下&#xff0c;大語言模型&#xff08;LLM&#xff09;憑借其強大的語言處理能力和廣泛的應用潛力&#xff0c;成為了各行業關注的焦點。從最初的文本生成、簡單問答&#xff0c;到如今在專業領域的深度應用&#xff0c;大語言模型與用戶的交互模式正…

mindyolo填坑

1、按照gitee上的文檔跑預測代碼&#xff0c;跑不通 更改&#xff1a; 將predict.py復制到跟目錄。如果是cpu&#xff08;本地測試比較常見&#xff09;&#xff0c;那么正確的命令行是&#xff1a; python predict.py --device_targetCPU --config ./configs/yolov7/yolov7.…

Python集合全解析:從基礎到高階應用實戰

一、集合核心特性與創建方法 1.1 集合的本質特征 Python集合&#xff08;Set&#xff09;是一種??無序且元素唯一??的容器類型&#xff0c;基于哈希表實現&#xff0c;具有以下核心特性&#xff1a; ??唯一性??&#xff1a;自動過濾重復元素??無序性??&#xff…