【LeetCode題解】LeetCode 35. 搜索插入位置

【題目鏈接】
35. 搜索插入位置
【題目描述】
在這里插入圖片描述
【題解】
通過題目可以知道這是一道經典的二分查找的題目,對于二分查找的題目,根據需要查找的兩個邊界點,分為兩個不同的模板,如下圖所示。
在這里插入圖片描述
這道題要求在數組中查找目標值并返回其索引,若目標值不存在,則返回它按順序插入的位置。因此,它適合使用綠色邊界點對應的二分查找模板。
該模板適用于查找最小滿足條件的值的場景,常用于定位滿足特定條件的最小值或區間的左邊界。其核心邏輯是通過不斷收縮右邊界,最終定位到符合條件的最小值。

其模板如下:

bool check(int x) {/* ... */} // 檢查x是否滿足某種性質int bsearch_2(int l, int r)
{while (l < r){int mid = l + r >> 1;if (check(mid)) r = mid;else l = mid + 1;}return l;
}

【AC代碼】

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int l = 0, r = nums.size();while(l < r) {int mid = l + r >> 1;if(nums[mid] >= target)r = mid;elsel = mid + 1;}return l;}
};

【思考】
1.能否使用紅色邊界點對應的模板呢?
這道題同樣可以用紅色邊界點對應的模板來解答,只是需要先將問題轉化為尋找最后一個小于目標值的元素位置,再通過推導得出插入位置。
該模板的核心是定位最后一個滿足條件的位置(即右邊界),而原問題實際需要的是第一個大于等于目標值的位置(即左邊界)。兩者的轉化邏輯很明確:插入位置 = 最后一個小于目標值的位置 + 1,而尋找最后一個小于目標值的位置恰好是紅色邊界點模板的典型應用場景。

其模板如下:

bool check(int x) {/* ... */} // 檢查x是否滿足某種性質int bsearch_1(int l, int r)
{while (l < r){int mid = l + r + 1 >> 1;if (check(mid)) l = mid;else r = mid - 1;}return l;
}

【AC代碼】

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int l = 0, r = nums.size() - 1; while (l < r) {int mid = (l + r + 1) / 2; if (nums[mid] < target) { l = mid;} else {                  r = mid - 1;}}// 循環結束后,l是最后一個可能<target的位置,需判斷是否真的滿足if (nums[l] < target) {return l + 1; // 存在<target的元素,插入位置為l+1} else {return l;     // 所有元素≥target,插入位置為l(即第一個≥target的位置)}}
};

2.模板的兩個邊界lr如何確定?
在ac之前,我卡在了一個地方,r一直取的值是r = nums.size() - 1,這導致在測試樣例時,示例1和示例2都可以通過,但輸入3確報了錯。通過調試輸出排查后發現,問題的根源在于邊界值的設置。
r = nums.size() - 1時,示例1:
l=0,r=3,mid=1,nums[mid]=3,3<target,l=mid+1=1+1=2;l=0,r=3,mid=1,nums[mid]=3,3<target,l=mid+1=1+1=2;l=0,r=3,mid=1,nums[mid]=3,3<target,l=mid+1=1+1=2;
l=2,r=3,mid=2,nums[mid]=5,5≥5,r=2;l=2,r=3,mid=2,nums[mid]=5,5≥5,r=2;l=2,r=3,mid=2,nums[mid]=5,55,r=2;
l=2,r=2,l=2,r=2,l=2,r=2,退出循環,返回l=2,答案正確
r = nums.size() - 1時,示例2:
l=0,r=3,mid=1,nums[mid]=3,3>target,r=1;l=0,r=3,mid=1,nums[mid]=3,3>target,r=1;l=0,r=3,mid=1,nums[mid]=3,3target,r=1;
l=0,r=1,mid=0,nums[mid]=1,1<target,l=mid+1=0+1=1;l=0,r=1,mid=0,nums[mid]=1,1<target,l=mid+1=0+1=1;l=0,r=1,mid=0,nums[mid]=1,1target,l=mid+1=0+1=1;
l=1,r=1,l=1,r=1,l=1,r=1,退出循環,返回l=1,答案正確
r = nums.size() - 1時,示例3:
l=0,r=3,mid=1,nums[mid]=3,3<target,l=mid+1=1+1=2;l=0,r=3,mid=1,nums[mid]=3,3<target,l=mid+1=1+1=2;l=0,r=3,mid=1,nums[mid]=3,3target,l=mid+1=1+1=2;
l=2,r=3,mid=2,nums[mid]=5,5<target,l=mid+1=2+1=3;l=2,r=3,mid=2,nums[mid]=5,5<target,l=mid+1=2+1=3;l=2,r=3,mid=2,nums[mid]=5,5target,l=mid+1=2+1=3;
l=3,r=3,l=3,r=3,l=3,r=3,退出循環,返回l=3,答案錯誤
通過上述分析可以發現,r = nums.size()的設置確保了搜索區間覆蓋所有可能的插入位置,而r = nums.size() - 1會漏掉插入到數組末尾的情況,導致部分測試用例失敗。
二分查找的核心是明確搜索區間的定義,并確保區間覆蓋所有可能的解

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

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

相關文章

RK3568 NPU RKNN(五):RKNN-ToolKit-lite2板端推理

文章目錄1、前言2、目標3、安裝RKNN-ToolKit-lite23.1、安裝環境3.2、安裝RKNN-ToolKit-lite23.3、驗證4、完整的測試程序5、運行測試程序6、程序拆解7、總結1、前言 本文僅記錄本人學習過程&#xff0c;不具備教學指導意義。 2、目標 之前提到過&#xff0c;RKNN-Toolkit2-…

二分查找。。

1 二分查找二分查找前提是數組有序。先令&#xff0c;left 0 , right 7mid (right left) / 2;如果mid的值大于要查找的值&#xff0c;則right mid - 1&#xff1b;如果小于&#xff0c;left mid 1&#xff1b;如果mid的值等于要查找的值&#xff0c;查找成功。重復步驟2…

Spring Ai 如何配置以及如何搭建

Spring Ai 如何配置以及如何搭建 解釋什么是Spring ai 首先&#xff0c;我們用Spring ai 其實不是去了解他的LLM,以及底層用的一些東西&#xff0c;Spring AI,提供給我們的其實是對各種大模型快速調用&#xff0c;提供了大模型API的作用&#xff0c;Spring AI 的核心定位是提…

FCC認證三星XR頭顯加速全球量產,微美全息AI+AR技術引領智能眼鏡硬件創新

據悉&#xff0c;三星(SSNGY.US)XR頭顯Project Moohan目前已獲得美國FCC認證&#xff0c;FCC認證表明該款頭顯即將上市&#xff0c;之前三星財報會議也表明確認將于今年年底推出XR頭顯。此前有報道稱&#xff0c;該設備將采用索尼旗艦級 OLEDoS 顯示屏&#xff0c;像素密度高達…

洛谷P1595講解(加強版)+錯排講解

前言接我原先的文章&#xff0c;因為一場考試&#xff0c;讓我對這道題記憶深刻注&#xff1a;&#xff08;因為那道題&#xff0c;所以80分&#xff09;正文1.分析題目題目&#xff1a;某人寫了 n 封信和 n 個信封&#xff0c;如果所有的信都裝錯了信封。求所有信都裝錯信封共…

提升化工制造質量的 7 種方法

盡管化工制造屬于制造業的一個子類別&#xff0c;但它是一個廣泛的范疇&#xff0c;涵蓋了基礎化學品、樹脂和合成纖維、農藥和化肥、涂料和粘合劑&#xff0c;甚至消費類化合物&#xff08;如肥皂和清潔化學品&#xff09;等所有領域。盡管這些細分領域差異巨大&#xff0c;但…

從“數據壟斷”到“全民共建”:Dataparts如何重構智能時代的數據流通規則?

從“數據壟斷”到“全民共建”&#xff1a;Dataparts如何重構智能時代的數據流通規則&#xff1f;在杭州某科技園區的會議室里&#xff0c;一場關于“AI大模型訓練數據”的討論正在激烈進行。某頭部AI企業的技術總監指著屏幕上的“對話場景零件庫”說&#xff1a;“過去我們花3…

31 HTB Union 機器 - 中等難度

第一階段 偵查nmap掃描oxdfparrot$ nmap -p- --min-rate 10000 -oA scans/nmap-alltcp 10.10.11.128 Starting Nmap 7.80 ( https://nmap.org ) at 2021-11-19 08:29 EST Nmap scan report for 10.10.11.128 Host is up (0.092s latency). Not shown: 65534 filtered ports POR…

【數據分享】上市公司創新韌性數據(2007-2023)

數據介紹核心看點&#xff1a; 在復雜多變的市場環境中&#xff0c;企業如何通過創新維持競爭力&#xff1f;創新韌性是衡量企業在外部沖擊下保持創新活力的關鍵指標。本文分享2007-2023年上市公司創新韌性數據&#xff0c;為研究企業抗風險能力提供核心支持。數據概覽數據名稱…

服務器配置開機自啟動服務

一、配置啟動文件sudo vim /etc/systemd/system/smartailab-backend.service sudo vim /etc/systemd/system/reall3d-frontend.servicesudo vim /etc/systemd/system/Culture_Liquor-backend.servicevim /etc/systemd/system/Culture_Liquor-backend.service內容&#xff1a;[U…

Ubuntu 25.04更新了哪些內容揭秘

2025年4月,Canonical正式推出Ubuntu 25.04 版本,代號"Plucky Puffin(勇敢的海鸚)"。此次發布圍繞AI算力強化、桌面交互革新與跨架構支持三大核心方向展開,為開發者、創作者及企業用戶帶來多項突破性升級。 一、核心系統更新 systemd v257.4帶來了重要的上游更新…

PHP反序列化的CTF題目環境和做題復現第2集_POP鏈構造

1 通過pop參數get方式提交反序列信息 2 題目 http://192.168.1.8/fxl2/fxl2_pop.php <?php highlight_file(__FILE__);class a {protected $var;public function hello(){echo $this->var;} }class b {public $cla;public function __destruct(){$this->cla->…

攻防世界—fakebook(兩種方法)

一.審題這邊先進行測試&#xff0c;login和join都失敗了&#xff0c;所以沒獲取到什么消息。二.dirsearch工具掃描所以拿dirsearch掃一下&#xff0c;看看有沒有什么文件可以訪問。python3 dirsearch.py -u url可以看到當前目錄下存在flag.php,robots.txt等&#xff0c;訪問fla…

AI+物聯網如何重塑倉儲供應鏈?3個落地場景與系統架構設計思路

一、引言 在科技飛速發展的當下&#xff0c;AI與物聯網技術的融合為倉儲供應鏈領域帶來了革新契機。這種融合不僅優化了傳統運作模式&#xff0c;還催生出更智能、高效的管理方案&#xff0c;業財一體管理軟件也在其中發揮著關鍵作用。 二、AI物聯網在倉儲供應鏈的落地場景 &am…

C++ 內存管理(內存分布 , 管理方式 , new和delete實現原理)

目錄 1. C/C內存分布 練習: 2. C語言動態內存管理方式 2.1 malloc/calloc/realloc的區別 2.2 malloc的實現原理 2.3 內存塊分布與擴容 3. C動態內存管理方式 3.1 new/delete操作類內置類型 1. new操作內置類型 2. delete操作內置類型 3.2 new/delete操作類自定義類型…

1.2. qemu命令起虛擬機增加網絡配置

1. 網絡配置 常見的網絡模式分為tap網絡和基礎網絡模式兩種。 1.1. TAP網絡&#xff08;橋接模式&#xff09; 虛擬機直接接入宿主機物理網絡&#xff0c;獲得獨立IP 1.1.1. 使用tap方式起虛擬機網絡-netdev tap,idhostnet0,ifnametap0 \-device virtio-net-pci,netdevhostnet0…

分享一個Oracle表空間自動擴容與清理腳本

一、基礎環境準備&#xff08;首次執行&#xff09; -- 1. 創建表空間監控表&#xff08;存儲使用率、容量等信息&#xff09; create table monitor_tablespace_rate (tbs_name varchar2(50), -- 表空間名total_gb number, -- 總容量(GB)used_gb number, …

Flink Sql 按分鐘或日期統計數據量

一、環境版本 環境版本Flink1.17.0Kafka2.12MySQL5.7.33 【注意】Flink 1.13版本增加Cumulate Window&#xff0c;之前版本Flink Sql 沒有 Trigger 功能&#xff0c;長時間的窗口不能在中途觸發計算&#xff0c;輸出中間結果。比如每 10S 更新一次截止到當前的pv、uv。只能用T…

LeetCode 2460.對數組執行操作

給你一個下標從 0 開始的數組 nums &#xff0c;數組大小為 n &#xff0c;且由 非負 整數組成。 你需要對數組執行 n - 1 步操作&#xff0c;其中第 i 步操作&#xff08;從 0 開始計數&#xff09;要求對 nums 中第 i 個元素執行下述指令&#xff1a; 如果 nums[i] nums[i …

深入解析 @nestjs/typeorm的 forRoot 與 forFeature

nestjs/typeorm 是 NestJS 與 TypeORM 集成的官方模塊&#xff0c;提供了 forRoot() 和 forFeature() 兩個核心靜態方法用于配置數據庫連接和實體注冊。本文將深入解析這兩個方法的機制、使用場景和最佳實踐。 一、TypeOrmModule.forRoot() - 全局數據庫配置 forRoot() 方法用于…