算法 —— 二分查找

目錄

二分查找

在排序數組中查找元素的第一個和最后一個位置

搜索插入位置

x的平方根

山峰數組的峰頂索引

尋找峰值

搜索旋轉排序數組中的最?值

點名


?二分查找模板分為三種:1、樸素的二分模板? ?2、查找左邊界的二分模板? 3、查找右邊界的二分模板(注意:不是數組有序才使用二分查找,只要存在二段性(一個條件把數組分為兩段)都可以使用二分查找)


二分查找

?代碼如下:

class Solution {
public:int search(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left <= right){int mid = left + (right - left) / 2;if (nums[mid] > target)right = mid - 1;else if (nums[mid] < target)left = mid + 1;elsereturn mid;}return -1;}
};

在排序數組中查找元素的第一個和最后一個位置

這道題可以引出另外兩個重要的二分查找模板:?查找左邊界的二分模板? ?查找右邊界的二分模板

?以上是兩個模板的內容,判斷條件根據題目內容修改,以題目示例1為例,下面給出具體解釋為什么這樣做可行:

?代碼如下:

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {// 處理為空if (nums.size() == 0)return { -1,-1 };// 找左端點int left_end_point = -1, right_end_point = -1;int left = 0, right = nums.size() - 1;while (left < right){int mid = left + (right - left) / 2;if (nums[mid] < target)left = mid + 1;elseright = mid;}// 判斷是否有結果if(nums[left]==target)left_end_point = left;// 找右端點   // left可以從左端點開始left = 0, right = nums.size() - 1;while (left < right){int mid = left + (right - left + 1) / 2;if (nums[mid] > target)right = mid - 1;elseleft = mid;}if(nums[right] == target)right_end_point = right;if(right_end_point != -1)return { left_end_point,right_end_point };elsereturn { -1,-1 };}
};

搜索插入位置

根據 二段性,可以把數組分為小于t和大于等于t兩部分,目標索引就是在大于等于的左邊界上。

注意示例3的邊界情況,代碼如下:

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0, right = nums.size();while (left < right){int mid = left + (right - left) / 2;if (nums[mid] < target)left = mid + 1;elseright = mid;}// 數組中所有元素小于targetif (nums[left] < target)return left + 1;return right;}
};

x的平方根

本題依舊是一個二分查找的算法思想,left為1,right為x本身,根據二段性,將x分為小于等于sqrt(x)的和大于sqrt(x)的注意小于1的小數和INT_MAX這兩個特殊情況,?INT_MAX平方后數據太大,要用long long類型來存儲。代碼如下:

class Solution {
public:int mySqrt(int x) {// 處理邊界情況if (x < 1)return 0;int left = 1, right = x;while (left < right){long long mid = left + (right - left + 1) / 2; // 防止溢出if (mid * mid > x)right = mid - 1;elseleft = mid;}return left;}
};

山峰數組的峰頂索引

本題依舊是一道二分查找題,數組被分為遞增段和遞減端兩部分,代碼如下:

class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int left = 1, right = arr.size() - 2;while (left < right){int mid = left + (right - left + 1) / 2;if (arr[mid] < arr[mid - 1])right = mid - 1;elseleft = mid;}return left;}
};

尋找峰值

class Solution {
public:int findPeakElement(vector<int>& nums) {int left = 0, right = nums.size() - 1;while (left < right){int mid = left + (right - left) / 2;if (nums[mid] < nums[mid + 1])left = mid + 1;elseright = mid;}return left;}
};

搜索旋轉排序數組中的最?值

class Solution {
public:int findMin(vector<int>& nums) {int left = 0, right = nums.size() - 1, target = nums[right];while (left < right){int mid = left + (right - left) / 2;if (nums[mid] > target)left = mid + 1;elseright = mid;}return nums[right];}
};

點名

?本題可以有多種解法:

此題查找的是左邊界,直接寫代碼即可:

class Solution {
public:int takeAttendance(vector<int>& records) {int left = 0, right = records.size() - 1;while (left < right){int mid = left + (right - left) / 2;if (records[mid] == mid)left = mid + 1;elseright = mid;}// 特殊情況0 1 2 3 缺少4return records[left] == left ? left + 1 : left;}
};

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

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

相關文章

【基于R語言群體遺傳學】-12-超顯性與次顯性

歡迎先看前面的博客&#xff0c;再繼續進行后面的內容&#xff1a; 群體遺傳學_tRNA做科研的博客-CSDN博客 當雜合子的適應度超出純合子的范圍時&#xff0c;二倍體能夠展現出更多令人著迷的選擇實例。這種形式的一種是雜合子優勢&#xff0c;或稱為“超顯性”&#xff0c;其…

【包郵送書】AIGC時代程序員的躍遷——編程高手的密碼武器

歡迎關注博主 Mindtechnist 或加入【智能科技社區】一起學習和分享Linux、C、C、Python、Matlab&#xff0c;機器人運動控制、多機器人協作&#xff0c;智能優化算法&#xff0c;濾波估計、多傳感器信息融合&#xff0c;機器學習&#xff0c;人工智能等相關領域的知識和技術。關…

深入了解 Huber 損失函數

深入了解 Huber 損失函數 在機器學習和深度學習的訓練過程中&#xff0c;選擇合適的損失函數對于模型性能的提升至關重要。MSE&#xff08;均方誤差&#xff09; 和 RMSE&#xff08;均方根誤差&#xff09; 是我們常見的回歸損失函數。然而&#xff0c;當數據中存在異常值&am…

無線麥克風哪個品牌音質最好,揭秘手機收音麥克風哪個牌子好!

隨著全球直播和短視頻行業的蓬勃發展&#xff0c;領夾麥克風因其便攜性和出色的錄音質量而備受青睞。用戶在各種場合下追求清晰、真實的錄音效果&#xff0c;領夾麥克風無疑是一個理想的選擇。 然而&#xff0c;面對市場上琳瑯滿目的品牌和型號&#xff0c;想要挑選一款性能優…

C++和Python螞蟻搬食和蚊蟲趨光性和浮標機群行為算法神經網絡

&#x1f3af;要點 &#x1f3af;機器人群行為配置和C行為實現&#xff1a;&#x1f58a;腳底機器人狹隘空間導航避讓障礙物行為 | &#x1f58a;腳底機器人使用攝像頭耦合共振&#xff0c;實現同步動作 | &#x1f58a;腳底機器群使用相機&#xff0c;計算彼此間“分子間勢能…

WAIC2024 上海 | Gooxi 全面展示智算新成果,加速人工智能落地應用

浦江之畔&#xff0c;大咖云集&#xff1b;智能浪潮&#xff0c;奔涌不息。7月4日&#xff0c;被譽為人工智能界風向標的世界人工智能大會暨人工智能全球治理高級別會議在上海盛大召開&#xff0c;Gooxi此次攜最新AI服務器以及解決方案參與&#xff0c;以算為擎賦能新質生產力&…

如何對待信息技術課上學生玩游戲現象

對待信息技術課上學生玩游戲的現象&#xff0c;需要采取一系列綜合措施&#xff0c;既要防止學生分心&#xff0c;又要確保課堂的教學質量和學生的積極參與。以下是一些建議&#xff1a; 1. 明確課堂規則&#xff1a;在課程開始之初&#xff0c;明確告知學生課堂上不允許玩游戲…

【UE Lua】 快速入門(基礎語法、與UE引擎的交互)

目錄 0 引言1 基礎語法1.1 變量和數據類型1.2 注釋1.3 控制結構1.4 函數1.5 表&#xff08;Table&#xff09;1.6 元表&#xff08;Metatable&#xff09;1.7 字符串操作1.8 模塊和包1.9 錯誤處理 2 數據結構 - 表2.1 表&#xff08;Table&#xff09;2.2 元表&#xff08;Meta…

HTML標簽類型全面介紹

HTML標簽類型全面介紹 HTML&#xff08;HyperText Markup Language&#xff09;是構建網頁的基礎語言&#xff0c;它通過一系列的標簽&#xff08;Tags&#xff09;來定義網頁的結構和內容。HTML標簽根據其功能和用途可以分為多個類型&#xff0c;每個類型都扮演著不同的角色。…

「數據結構詳解·十四」對頂堆

「數據結構詳解一」樹的初步「數據結構詳解二」二叉樹的初步「數據結構詳解三」棧「數據結構詳解四」隊列「數據結構詳解五」鏈表「數據結構詳解六」哈希表「數據結構詳解七」并查集的初步「數據結構詳解八」帶權并查集 & 擴展域并查集「數據結構詳解九」圖的初步「數據結構…

【計算機畢業設計】017基于微信小程序的學生公寓電費信息管理系統

&#x1f64a;作者簡介&#xff1a;擁有多年開發工作經驗&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的項目或者畢業設計。 代碼可以私聊博主獲取。&#x1f339;贈送計算機畢業設計600個選題excel文件&#xff0c;幫助大學選題。贈送開題報告模板&#xff…

多線程網絡實戰之仿qq群聊的服務器和客戶端

目錄 一、前言 二、設計需求 1.服務器需求 2.客戶端需求 三、服務端設計 1.項目準備 2.初始化網絡庫 3.SOCKET創建服務器套接字 4. bind 綁定套接字 5. listen監聽套接字 6. accept接受客戶端連接 7.建立套接字數組 8. 建立多線程與客戶端通信 9. 處理線程函數&…

【3GPP核心網】【5G】精講5G核心網系統架構主要特征

目錄 前言 1. 5G核心網系統架構主要特征 1.1 5G核心網與4G核心網EPC區別 1.2 5G核心網系統架構主要特征 2. 5G網絡邏輯架構 2.1 新型基礎設施平臺 2.2 邏輯架構 前言 首先需要理解核心網的角色定位&#xff0c;作為移動通信網絡的核心部分&#xff0c;核心網起著承上啟下的作用…

【收藏】歐盟CE、美國FDA法規及標準查詢常用網站

01 CE法規&標準查詢網站 醫療器械主管部門的網站 網址: https://www.camd-europe.eu/ 簡介: CAMD的全稱是Competent authorities for medical devices&#xff0c;翻譯成中文叫做醫療器械監管機構&#xff0c;實際上它指的是歐盟成員國醫療器械監管機構的聯盟&#xff…

PLSQL Day3

--7.鍵盤輸入1-10之間的任意一個數字&#xff0c;輸出這個數字的階乘&#xff1a; [3!1*2*3] [5!1*2*3*4*5] declare n number : &輸入一個數字; s number : 1; begin if n between 1 and 10 then for i in 1..n loop s : i*s; end loop; dbms…

程序人生【追光的日子】今天我們不談技術,談一談:人工智能的意義到底是什么?來看看今天分享的故事...我想我們都愿意相信,也許AI真的會有溫度,這一天不遠了~!

有志者,事竟成,破釜沉舟,百二秦關終屬楚;苦心人,天不負,臥薪嘗膽,三千越甲可吞吳。 ??作者主頁: 追光者♂?? ??個人簡介: ??[1] 計算機專業碩士研究生?? ??[2] 2023年城市之星領跑者TOP1(哈爾濱)?? ??[3] 2022年度博客之星人工智能領域…

Java SpringBoot MongoPlus 使用MyBatisPlus的方式,優雅的操作MongoDB

Java SpringBoot MongoPlus 使用MyBatisPlus的方式&#xff0c;優雅的操作MongoDB 介紹特性安裝新建SpringBoot工程引入依賴配置文件 使用新建實體類創建Service測試類進行測試新增方法查詢方法 官方網站獲取本項目案例代碼 介紹 Mongo-Plus&#xff08;簡稱 MP&#xff09;是一…

網絡服務器配置與管理

網絡服務器配置與管理是一個涉及多個方面的領域&#xff0c;它涵蓋了從物理硬件的設置到操作系統、網絡服務和應用的配置&#xff0c;再到日常維護和安全策略的實施。以下是網絡服務器配置與管理的一些核心概念和步驟&#xff1a; 硬件配置&#xff1a; 選擇合適的服務器硬件&a…

網站易被攻擊原因及保護措施

網絡攻擊是指通過惡意手段侵犯網絡系統的穩定性和安全性的行為。很多網站都成為黑客攻擊的目標&#xff0c;因此對于網站管理員和網絡用戶來說&#xff0c;了解各種被攻擊的方式以及如何解決是非常重要的。本文將介紹一些常見的網站攻擊方式&#xff0c;并提供一些解決方案 1.…

基于docker上安裝elasticSearch7.12.1

部署elasticsearch 首先&#xff0c;先創建網絡 # 創建網絡 docker network create es-net拉取elasticSearch的鏡像 #拉取鏡像 docker pull elasticsearch:7.12.1創建掛載點目錄 # 創建掛載點目錄 mkdir -p /usr/local/es/data /usr/local/es/config /usr/local/es/plugin…