【LeetCode題解】LeetCode 33. 搜索旋轉排序數組

【題目鏈接】
33. 搜索旋轉排序數組
【題目描述】
在這里插入圖片描述
【題解】
對于一個有序數組,我們可以使用二分查找算法來查找某個元素,具體的算法模板可以參考【算法基礎課-算法模板1】基礎算法中二分查找一節的內容。
然而,在這道題目中,數組并不是完全有序的,而是經過旋轉后,只保證了數組的某一部分是有序的。那么,是否仍然可以使用二分查找算法呢?答案是可以的。我們可以利用旋轉數組的性質,通過判斷數組的哪一部分是有序的,來調整查找范圍,從而有效地應用二分查找算法。
通過觀察常規的二分查找算法,我們可以看到 mid 將原本有序的序列劃分為 [l, mid][mid+1, r] 兩個部分。因此,我們可以借鑒這一思想來解決本題。在這道題中,我們可以通過判斷 [l, mid][mid+1, r] 這兩部分中哪一部分是有序的,然后根據這個有序部分來調整二分查找的上下邊界。具體而言,若某一部分是有序的,我們就可以判斷目標值 target 是否位于該有序部分內,從而決定是將查找范圍縮小到該部分,還是縮小到另一部分。這種方法使得我們能夠在旋轉數組中有效地找到目標值。

  • 如果[l, mid]是有序數組,且target的大小滿足[nums[l], nums[mid]),則我們應該將搜索范圍縮小至[l, mid - 1],否則將搜索范圍縮小至[mid + 1, r]
  • 如果[mid, r]是有序數組,且target的大小滿足(nums[mid], nums[r]],則我們應該將搜索范圍縮小至[mid + 1, r],否則將搜索范圍縮小至[l, mid - 1]

例如:
nums=[4,5,6,7,0,1,2],其中l=0,r=6,mid=3[l,mid]是有序數組,
如果target=5,在[l,mid-1]中尋找;
如果target=2,在[mid+1,r]中尋找。
nums=[6,7,0,1,2,3,4,5],其中l=0,r=6,mid=3[mid,r]是有序數組,
如果target=6,在[l,mid-1]中尋找;
如果target=4,在[mid+1,r]中尋找。

【AC代碼】

class Solution {
public:int search(vector<int>& nums, int target) {int l = 0, r = nums.size() - 1;while(l <= r) {int mid = l + r >> 1;// 如果找到了目標值,直接返回下標if(nums[mid] == target)return mid;// 判斷哪一部分是有序的if(nums[l] <= nums[mid]) { // 左半部分有序if(nums[l] <= target && target < nums[mid]) r = mid - 1; // 目標在左半部分,縮小右邊界else //l = mid + 1; // 目標不在左半部分,縮小左邊界} else { // 右半部分有序if(nums[mid] < target && target <= nums[r])l = mid + 1;  // 目標在右半部分,縮小左邊界elser = mid - 1; // 目標不在右半部分,縮小右邊界} }return -1;}
};

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

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

相關文章

使用 Serverless 架構快速構建基于 Iceberg 的事務型實時數據湖

文章目錄1. 背景介紹2. 架構設計3. 方案實現3.1 CDC3.1.1 自定義插件3.1.2 配置 MSK Connect3.2 實時攝入3.2.1 Glue 實現方案3.2.1.1 在 Glue 中創建 Kafka connection3.2.1.2 Glue Streaming 任務3.2.2 EMS Serverless 實現方案3.3 使用 Athena 查詢 Iceberg 表3.3.1 查詢3.3…

Java零基礎筆記20(Java高級技術:單元測試、反射、注解、動態代理)

1.單元測試2.反射2.1 反射第一步&#xff1a;加載類&#xff0c;獲取類的字節碼&#xff0c;class對象2.2 獲取類中的成分&#xff08;構造器、成員變量、成員方法&#xff09;&#xff0c;并對其進行操作獲取構造器的作用&#xff1a;獲取成員變量的作用&#xff1a;獲取成員…

WinDbg 調試

安裝 Windows 調試器 WinDbg 是一種調試器,可用于分析故障轉儲、調試實時用戶模式和內核模式代碼,以及檢查 CPU 寄存器和內存。 此最新版本具有更新的界面、完全現成的腳本功能、可擴展的調試數據模型、內置的時間旅行調試(TTD)支持和許多其他功能,具有更現代的用戶體驗。…

topographic terrain

在中文語境中&#xff0c;topographic&#xff08;地形學&#xff09;和 terrain&#xff08;地形&#xff09;這兩個詞都與地表特征相關&#xff0c;但它們的含義和使用場景有細微差別。以下是它們的區別&#xff1a; 1. 定義Topographic&#xff08;地形學的&#xff09;&…

SpringCloud 06 服務容錯 Sentinel

雪崩&#xff1a;一個微小的故障引起系統其他部分出現故障&#xff0c;最終使整個系統不可用。 雪崩一般經歷以下三個階段&#xff1a; 實例能力出現過載。可能是 bug 導致性能下降&#xff0c;可能是實例宕機&#xff0c;可能是突發流量&#xff0c;總之實例無法處理如此多請求…

Qt同步處理業務并禁用按鈕

1.界面代碼 //按鈕1 void Dialog::on_pushButton1_clicked() {qDebug("pushButton1 clicked start");enableBtns(false);//禁用按鈕qDebug("pushButton1 do sth start");QThread::sleep(5);//休眠&#xff0c;作為同步處理業務qDebug("pushButton1 do…

虛擬專用網技術

一、需求背景物理聯通&#xff1a;實現不同物理位置網絡的連接基礎。網絡聯通&#xff1a;在物理連接基礎上&#xff0c;實現數據等信息的傳輸互通。二、虛擬專用網簡介定義虛擬私有網絡是依靠互聯網服務提供商&#xff08;ISP&#xff09;或其他網絡服務提供商&#xff08;NSP…

GANs生成對抗網絡生成手寫數字的Pytorch實現

目錄 一、第三方庫導入 二、數據集準備 三、使用轉置卷積的生成器 四、使用卷積的判別器 五、生成器生成圖像 六、主程序 七、運行結果 7.1 生成器和判別器的損失函數圖像 7.2 訓練過程中生成器生成的圖像 八、完整的pytorch代碼 由于之前寫gans的代碼時&#xff0c;…

ubuntu 通過NAT模式上網

這里必須使用VMnet8 設置為NAT模式 下面設置Ip地址區域ubuntu ip地址設置來自于上面

盲盒抽谷機小程序系統開發:從0到1的完整方法論

開發一款成功的盲盒抽谷機小程序系統&#xff0c;需兼顧技術實現、用戶體驗與商業邏輯。本文將從需求分析、UI/UX設計、技術架構、測試上線到運營增長&#xff0c;系統梳理從0到1的完整方法論。需求分析&#xff1a;明確“為誰而做”盲盒抽谷機的核心用戶是18-35歲的二次元愛好…

web開發,在線%射擊比賽管理%系統開發demo,基于html,css,jquery,python,django,三層mysql數據庫

經驗心得 兩業務單&#xff0c;業務crud開發很簡單了&#xff0c;自行學習&#xff0c;我說一下學習流程。什么是前端&#xff0c;用到那些技術html,css,javascript分別是什么&#xff1f;進階jquery,bootstrap,各種常見前端組件又是什么&#xff0c;前端框架react,angular以及…

Centos9傻瓜式linux部署CRMEB 開源商城系統(PHP)

服務器環境推薦要求* Nignx&#xff08;必須&#xff09; * PHP 7.1 ~ 7.4&#xff08;必須此版本內&#xff0c;版本過大會警告不兼容&#xff09; * MySQL 5.7 &#xff5e; 8.0&#xff08;必須&#xff09; * Redis&#xff08;非必須&#xff09;后臺頁面展示&#xff1a;…

AI 云電競游戲盒子:從“盒子”到“云-端-芯”一體化競技平臺的架構實踐

摘要 AI 云電競游戲盒子&#xff08;以下簡稱“電競盒”&#xff09;不再是一臺簡單的客廳游戲主機&#xff0c;而是一套以 AI 調度為核心、以云原生架構為骨架、以邊緣渲染為肌肉、以端側感知為神經的“云-端-芯”協同競技系統。本文基于 2024 年 Q2 落地的量產方案&#xff0…

基于kuboard實現kubernetes的集群管理

1、前提條件安裝docker-compose2、步驟在本地目錄創建kuboard-v4\在該目錄下創建文件docker-compose.yaml&#xff0c;內容如下&#xff1a;configs:create_db_sql:content: |CREATE DATABASE kuboard DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;cre…

Linux操作系統軟件編程——多線程

什么是線程線程的定義是輕量級的進程&#xff0c;可以實現多任務的并發。線程是操作系統任務調度的最小單位線程的創建由某個進程創建&#xff0c;且進程創建線程時&#xff0c;會為其分配獨立的棧區空間&#xff08;默認8M&#xff09;。線程和所在的進程&#xff0c;以及進程…

linux下找到指定目錄下最新日期log文件

以下是一個完整的C函數&#xff0c;用于在指定目錄下自動查找最近更新的日志文件&#xff08;根據文件名中的時間戳選擇最新的文件&#xff09;&#xff1a;#include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include…

《數學模型》經典案例——鋼管的訂購與運輸

一、問題描述 要鋪設一條 A1→A2→?→A15A_1 \rightarrow A_2 \rightarrow \cdots \rightarrow A_{15}A1?→A2?→?→A15? 的輸送天然氣的主管道&#xff0c;如圖 6.22 所示。經篩選后可以生產這種主管道鋼管的鋼廠有 S1,S2,?,S7S_1, S_2, \cdots, S_7S1?,S2?,?,S7? 。…

Java Web部署

今天小編來分享下如何將本地寫的Java Web程序部署到Linux上。 小編介紹兩種方式&#xff1a; 部署基于Linux Systemd服務、基于Docker容器化部署 首先部署基于Linux Systemd服務 那么部署之前&#xff0c;要對下載所需的環境 軟件下載 Linux&#xff08;以ubuntu&#xf…

告別AI“煉丹術”:“策略懸崖”理論如何為大模型對齊指明科學路徑

摘要&#xff1a;當前&#xff0c;我們訓練大模型的方式&#xff0c;尤其是RLHF&#xff0c;充滿了不確定性&#xff0c;時常產生“諂媚”、“欺騙”等怪異行為&#xff0c;被戲稱為“煉丹”。一篇來自上海AI Lab的重磅論文提出的“策略懸崖”理論&#xff0c;首次為這個混沌的…

深入理解C#特性:從應用到自定義

——解鎖元數據標記的高級玩法&#x1f4a1; 核心認知&#xff1a;特性本質揭秘 public sealed class ReviewCommentAttribute : System.Attribute { ... }特性即特殊類&#xff1a;所有自定義特性必須繼承 System.Attribute&#xff08;基礎規則&#xff09;命名規范&#xff…