Leetcode刷題筆記6

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

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

解法一:暴力查找

[1, 2, 3, 3, 3, 4, 5] t = 3
從前往后掃描暴力查找,最壞情況下O(N)

優化
利用數組有序的特性

解法二:樸素二分

[1, 2, 3, 3, 3, 4, 5] t = 3
?L? ? ? ? ? ?M ? ? ? ?R
在極端情況下時間復雜度會降低,比如如果數組內的元素都一樣

優化
[1, 2, 3, 3, 3, 4, 5] t = 3
[? ? ? ? ? ?] [ ? ? ? ? ? ?]
左邊區間小于t,右邊區間大于等于t

當發現問題中有二段線的規律時就可以用二分查找

?L ? ? ? ? ? ? M ? ? ? ? ? ? R
[-----------------------------] t
? ? ? ? ? ? ? ?x


查找區間左端點

1. x < t -> left = mid + 1 -> [left,right]

2. x >= t -> right = mid -> [left, right]?

因為 mid有可能是最終結果,所以不能更新到 mid + 1

細節處理:

1. 循環條件
left < right

a. 當 left = right的時候就是最終結果,無需判斷
b. 如果判斷,就會死循環

第一種情況:[left, right]中有結果
?L? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?R
[-----------------------------] t
[? ? ? ? ? ? ][ ? ? ? ? ? ? ? ? ? ?] ? ? ? ??
? ? ? ? ? ?t
因為 left = mid + 1,所以 left是想跳出左邊這個區域的
當left和right相遇的位置就是最終結果

第二種情況:全大于t
?L? ? ? ? ? ? ? ? ? ? ? ? ? ? ? R
[-----------------------------] t
只會命中第二個條件,right只會像左移動
直接判斷左端點的值是否是t

第三種情況:全小于t
只會命中第一個條件,left只會像右移動
直接判斷右端點的值是否是t

2. 求中點的操作
a. left + (right - left) / 2
b. left + (right - left + 1) / 2
當數組的個數是偶數時,用a求中點是靠左,用b是靠右

用b會陷入死循環,因為是右端點

當a。求的是左端點,當命中第一個條件時left會右移,此時相等的話就終止循環
當命中第二個條件時,right會更新到mid,此時兩個又相遇了,又終止循環了
所以求中點的操作只能用a才能終止循環

查找區間右端點

[1, 2, 3, 3, 3, 4, 5] t = 3
[? ? ? ? ? ? ? ? ? ? ][ ? ?]

左邊區間全部小于等于t,右邊全部大于t

?L ? ? ? ? ? ? M ? ? ? ? ? ? R
[-----------------------------] t
? ? ? ? ? ? ? ? x
1. x <= t,mid此時在左邊區域,所以更新left -> left = mid -> [left, right] left和right中繼續尋找結果

2. x > t,mid此時在右邊區域,更新right -> right = mid - 1 -> [left, right]

處理細節:
1. 循環條件
left < right

2. 求中點的方式
a. left + (right - left) / 2
b. left + (right - left + 1) / 2

b求的是右端點
當最后元素剩2個時
[* *]
?L R

如果使用a,那么mid現在落在L,那么對于第一個條件,left會在這里不動,然后mid又落在這個位置,就會陷入死循環
使用b,mid就在R,當命中第一個條件時,left會移動到right,終止循環
命中第二個條件,right移動到left,也會終止循環

代碼:C++

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {// 處理邊界情況if(nums.size() == 0) return {-1, -1};int begin = 0;// 1. 二分左端點int left = 0, right = nums.size() - 1;while(left < right){int mid = left + (right - left) / 2; // 中點下標if(nums[mid] < target) left = mid + 1;else right = mid;}// 結束循環后,left和right相遇// 判斷是否有結果if(nums[left] != target) return {-1, -1};else begin = left; // 等于left或right都一樣,標記左端點// 2. 二分右端點// 其實left不需要重置,但是為了保持代碼的獨立性left = 0, right = nums.size() - 1;while(left < right){int mid = left + (right - left + 1) / 2; // 中點下標if(nums[mid] <= target) left = mid;else right = mid - 1;}return {begin, right}; // 此時left或者right都存的右端點}
};

當下面出現 -1 的時候,上面就 +1
分類討論的代碼,就題論題即可

查找區間左端點的模版

// 查找區間左端點的模版
while (left < right)
{int mid = left + (right - left) / 2;if (...) left = mid + 1;else right = mid;
}

?查找區間右端點的模版

// 查找區間右端點的模版
while (left < right)
{int mid = left + (right - left + 1) / 2;if (...) left = mid;else right = mid - 1;
}

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

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

相關文章

【LLM多模態】綜述Visual Instruction Tuning towards General-Purpose Multimodal Model

note 文章目錄 note論文1. 論文試圖解決什么問題2. 這是否是一個新的問題3. 這篇文章要驗證一個什么科學假設4. 有哪些相關研究&#xff1f;如何歸類&#xff1f;誰是這一課題在領域內值得關注的研究員&#xff1f;5. 論文中提到的解決方案之關鍵是什么&#xff1f;6. 論文中的…

隨想錄 Day45 1049. 最后一塊石頭的重量 II 494. 目標和 474.一和零

隨想錄 Day45 1049. 最后一塊石頭的重量 II 494. 目標和 474.一和零 1049. 最后一塊石頭的重量 II 題目鏈接 有一堆石頭&#xff0c;用整數數組 stones 表示。其中 stones[i] 表示第 i 塊石頭的重量。 每一回合&#xff0c;從中選出任意兩塊石頭&#xff0c;然后將它們一起…

帶你學習Mybatis之Mybatis全局配置文件

Mybatis全局配置文件 <?xml version"1.0" encoding"UTF-8"?><configuration> <!-- 配置 --> <properties/> <!-- 屬性 --> <settings/> <!-- 設置 --> <typeAliases/> <!-- 類型別名 -->…

車載以太網的未來:OPEN Alliance下17個技術委員會的最新進展與行業影響(下)

從上篇介紹來看&#xff0c;TC1-TC8大多數處于暫停或完成狀態。而TC9-TC17在2023年都有不同程度的進展&#xff0c;讓我們繼續探索藏在其中的車載以太網的發展和挑戰。 TC9 Automotive Ethernet Channel & Components&#xff08;in progress&#xff09; TC9的目標是為通…

[初始計算機]——計算機網絡的基本概念和發展史及OSI參考模型

&#x1f3e1;作者主頁&#xff1a;點擊&#xff01; &#x1f916;網絡通信基礎TCP/IP專欄&#xff1a;點擊&#xff01; ??創作時間&#xff1a;2024年5月30日11點59分 &#x1f004;?文章質量&#xff1a;96分 ? 目錄 &#x1f310;計算機網絡概述 &#x1f4af;…

opencv是什么?它有什么功能和特性?它值不值得我們去學習?我們該如何去學習呢?

1.opencv是什么&#xff1f; OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺庫&#xff0c;旨在提供一系列豐富的圖像處理和計算機視覺算法&#xff0c;以及用于構建實時圖像處理和機器視覺應用程序的開發工具。它最初由英特爾開發…

使用QT可視化操作信號與槽函數詳解

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、引言 二、QT信號與槽機制概述 三、實際操作步驟 四、案例演示 五、總結 一、引言 在…

中國養生保健元宇宙-探索養生保健新領域

在全球化和科技迅速發展的今天&#xff0c;元宇宙作為一種全新的互聯網應用和社會形態&#xff0c;正逐步滲透到人們生活的各個方面。特別是在養生保健領域&#xff0c;中國的元宇宙概念正在引領一場革命&#xff0c;將古老的養生智慧與現代科技完美融合&#xff0c;為人們打造…

單片機建立自己的庫文件(1)

文章目錄 前言一、代碼模塊化是什么&#xff1f;二、使用步驟1.以LCD1602作為例子2.將LCD1602 相關的代碼抽取到另外一個文件中 三、調用LCD1602.h1.新建一個工程項目&#xff0c;將LCD1602.h添加到工程中2.在主函數上加入 #include <LCD1602.h> 總結 前言 提示&#xf…

進口鋁合金電動隔膜泵

進口鋁合金電動隔膜泵是一種高效、可靠的工業泵&#xff0c;其特點、性能與應用廣泛&#xff0c;以下是對其的詳細分析&#xff1a; 特點 材質與結構&#xff1a; 采用鋁合金材料制造&#xff0c;具有良好的耐腐蝕性和輕量化特點。鋁合金材質使得泵體結構緊湊、輕便&#xff…

svg實現一個圓形以及方形的環形進度條

1. svg實現圓形進度條 效果圖&#xff1a; 1. 寫個假接口&#xff1a; let res {curLegendList: [{ progress: "87", name: "進度1",color:"#00fe41" },{ progress: "66", name: "進度2" ,color:"orange"},{ p…

gitlab服務器遷移(親測有效)

描述&#xff1a;最近公司遷移gitlab&#xff0c;我沒有遷移過&#xff0c;經過網上查找資料最終完成遷移&#xff0c;途中也遇到挺多坑和兩個問題&#xff0c;希望能幫到你。 新服務器安裝gitlab 注意&#xff1a;新服務器gitlab版本也需要和舊版本一致。 首先查看原Gitlab…

基于Python實現地震數據可視化的設計與實現

基于Python實現地震數據可視化的設計與實現 “Design and Implementation of Earthquake Data Visualization using Python” 完整下載鏈接:基于Python實現地震數據可視化的設計與實現 文章目錄 基于Python實現地震數據可視化的設計與實現摘要第一章 引言1.1 研究背景1.2 研究…

RabbitMQ(三)SpringBoot整合,可靠性投遞,死信隊列,延遲隊列,消費端限流,消息超時

文章目錄 整合Springboot概述消費者生產者 消息可靠性投遞故障原因解決方案生產者端消息確認機制&#xff08;故障情況1&#xff09;故障情況2解決方案故障情況3解決方案 消費端限流概念 消息超時概念隊列層面&#xff1a;配置隊列過期消息本身&#xff1a;配置消息過期 死信隊…

C++中的虛函數和純虛函數

目錄 摘要 虛函數&#xff08;Virtual Functions&#xff09; 定義 用法 純虛函數&#xff08;Pure Virtual Functions&#xff09; 定義 用法 需要避開的坑 總結 摘要 在C中&#xff0c;我們經常會在開發中使用到虛函數&#xff08;Virtual Functions&#xff09;和…

如何有效屏蔽手機上的騷擾電話20240530

如何有效屏蔽手機上的騷擾電話 引言 最近&#xff0c;我的手機經常接到954開頭的7位數字座機電話&#xff0c;這些騷擾電話讓我非常困擾。由于我經常點外賣&#xff0c;無法屏蔽所有陌生號碼&#xff0c;因此需要一個既能屏蔽特定前綴的騷擾電話&#xff0c;又不影響日常生活…

英偉達(NVIDIA)H100性能及應用場景

英偉達H100是一款性能強大的GPU芯片&#xff0c;其關鍵性能參數和應用領域可以歸納如下&#xff1a; 一、性能參數 架構&#xff1a;H100采用了新一代的Hopper架構&#xff0c;擁有高達1.8萬億次/秒的張量處理能力和高達840 TFLOPS的FP8張量性能。CUDA核心數&#xff1a;H100…

STM32學習和實踐筆記(33):待機喚醒實驗

1.STM32待機模式介紹 很多單片機具有低功耗模式&#xff0c;比如MSP430、STM8L等&#xff0c;我們的STM32也不例外。默認情況下&#xff0c;系統復位或上電復位后&#xff0c;微控制器進入運行模式。在運行模式下&#xff0c;HCLK 為CPU提供時鐘&#xff0c;并執行程序代碼。這…

kafka學習筆記06

Kafka數據存儲流程和log日志講解 講解分布式應用核心CAP知識 Kafka數據可靠性保證原理之副本機制Replica介紹《上》 Kafka數據可靠性保證原理之副本機制Replica介紹《下》 Kafka數據可靠性保證原理之ISR機制講解 Kafka的HighWatermark的作用你知道多少

暑期來臨,AI智能視頻分析方案筑牢防溺水安全屏障

隨著夏季暑期的來臨&#xff0c;未成年人溺水事故頻發。傳統的防溺水方式往往依賴于人工巡邏和警示標識的設置&#xff0c;但這種方式存在人力不足、反應速度慢等局限性。近年來&#xff0c;隨著視頻監控智能分析技術的不斷發展&#xff0c;其在夏季防溺水中的應用也日益凸顯出…