4-二分-索引二分-搜索旋轉排序數組 II

這是索引二分的第四篇算法,力扣鏈接

已知存在一個按非降序排列的整數數組?nums?,數組中的值不必互不相同。

在傳遞給函數之前,nums?在預先未知的某個下標?k0 <= k < nums.length)上進行了?旋轉?,使數組變為?[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下標?從 0 開始?計數)。例如,?[0,1,2,4,4,4,5,6,6,7]?在下標?5?處經旋轉后可能變為?[4,5,6,6,7,0,1,2,4,4]?。

給你?旋轉后?的數組?nums?和一個整數?target?,請你編寫一個函數來判斷給定的目標值是否存在于數組中。如果?nums?中存在這個目標值?target?,則返回?true?,否則返回?false?。

你必須盡可能減少整個操作步驟。

示例?1:

輸入:nums = [2,5,6,0,0,1,2], target = 0
輸出:true

示例?2:

輸入:nums = [2,5,6,0,0,1,2], target = 3
輸出:false

老規矩,先上無腦暴力求解,這道題就是普通的旋轉數組,呈斷崖式遞增,和之前的旋轉數組類似,最本質的區別是當前的題會有重復的場景。

func search(nums []int, target int) bool {for _, num := range nums {if num == target {return true}}return false
}

二分法邏輯其實和旋轉數組也差不多,借此機會復習一下。

這里要分情況討論,先確定target位于的區間。

如果target在左區間(target >= nums[0]):

- 如果mid位于左區間(nums[mid]?> nums[0]),正常二分法可以找到解。

- 如果mid位于右區間(nums[mid] < nums[0]),盡量使右指針左移到左邊界。

如果target在右邊界(target <?nums(len(nums)-1)

- 如果mid位于左區間(nums[mid]?> nums[0]),盡量使左指針靠近右區間左邊界。

-?如果mid位于右區間(nums[mid] < nums[0]),正常二分法可以求解。

得到代碼如下:

func search(nums []int, target int) bool {l, r := 0, len(nums)-1for l <= r {mid := l + (r-l)/2if nums[mid] == target {return true}if target >= nums[0] {if nums[mid] >= nums[0] {if nums[mid] < target {l = mid + 1} else {r = mid - 1}} else {r = mid - 1}} else {if nums[mid] <= nums[len(nums)-1] {if nums[mid] < target {l = mid + 1} else {r = mid - 1}} else {l = mid + 1}}}return false
}

執行發現,并沒通過,在[1,0,1,1,1]找0的場景報錯了,為什么呢?因為nums[l] == nums[mid] == nums[r] 并不能判斷出來,當前位于哪個區間。

我們可以嘗試 l++ r-- 縮小一下范圍,這樣就沒有左右區間模糊的場景了。

但是還有一個問題,原來的整體坐標邊界參考是nums[0]和nums[len(nums)-1],在縮小范圍后,也會隨之變化為nums[l] 和 nums[r]。

得到代碼如下:

func search(nums []int, target int) bool {l, r := 0, len(nums)-1for l <= r {mid := l + (r-l)/2if nums[mid] == target {return true}if nums[l] == nums[r] && nums[l] == nums[mid] {l++r--continue}if target >= nums[l] {if nums[mid] >= nums[l] {if nums[mid] < target {l = mid + 1} else {r = mid - 1}} else {r = mid - 1}} else {if nums[mid] <= nums[r] {if nums[mid] < target {l = mid + 1} else {r = mid - 1}} else {l = mid + 1}}}return false
}

邏輯優化:

func search(nums []int, target int) bool {l, r := 0, len(nums)-1for l <= r {mid := l + (r-l)/2if nums[mid] == target {return true}if nums[l] == nums[r] && nums[l] == nums[mid] {l++r--continue}if target >= nums[l] {if nums[mid] >= nums[l] && nums[mid] < target {l = mid + 1} else {r = mid - 1}} else {if nums[mid] <= nums[r] && nums[mid] > target {r = mid - 1} else {l = mid + 1}}}return false
}

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

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

相關文章

RocketMQ-源碼架構

源碼環境搭建 1、主要功能模塊 RocketMQ官方Git倉庫地址&#xff1a;GitHub - apache/rocketmq: Apache RocketMQ is a cloud native messaging and streaming platform, making it simple to build event-driven applications. RocketMQ的官方網站下載&#xff1a;下載 | R…

現在多種數據庫的讀寫模型對比

目錄 mongDB read write ES read write MySql write 總結 mongDB 3.0 版本后的WiredTiger存儲引擎 read 1. 應用通過driver 發起Buffer I/O讀操作&#xff0c;由操作系統將磁盤數據頁加載到文件系統的頁緩存區 2. 引擎層讀取頁緩沖區的數據&#xff0c;進行解壓后放…

C++STL算法庫中謂詞的使用

什么是c的謂詞 謂詞概念&#xff1a; 謂詞函數是一個判斷式&#xff0c;一個返回bool值的函數或者仿函數&#xff0c;有幾個入參就是幾元謂詞。一般做一個函數的參數使用【引用自百度百科】。 常見的可以作為謂詞的東西&#xff1a;函數、函數指針、函數對象、lambda表達式&am…

2023 年浙江省職業院校技能大賽信息安全管理與評估賽項規程

*2023 年浙江省職業院校技能大賽“高職組”* *“信息安全管理與評估”賽項規程* *一、賽項名稱* 賽項名稱&#xff1a;信息安全管理與評估 英文名稱&#xff1a;Information Security Management and Evaluation 賽項組別&#xff1a;高職 賽項歸屬產業&#xff1a;電子信…

熱電廠發電機組常見故障及預測性維護方法

熱電廠的發電機組是關鍵的能源生產設備&#xff0c;在電力供應中扮演著關鍵角色。但經過長期運行和高負荷工作&#xff0c;一旦發生故障&#xff0c;可能導致停機、設備損壞甚至引發嚴重事故。因此&#xff0c;實施有效的預測性維護方法對于確保發電機組的穩定運行至關重要。本…

Linux(17):認識與分析登錄檔

什么是登錄檔 【詳細而確實的分析以及備份系統的登錄文件】是一個系統管理員應該要進行的任務之一。 登錄檔 就是記錄系統活動信息的幾個文件&#xff0c;例如&#xff1a;何時、何地(來源IP)、何人(什么服務名稱)、做了什么動作(訊息登錄啰)。 換句話說就是&#xff1a;記錄系…

【MySQL】:表的操作

表的操作 一.創建表二.查看表結構三.修改表四.刪除表 一.創建表 field 表示列名。 datatype 表示列的類型。 character set 字符集&#xff0c;如果沒有指定字符集&#xff0c;則以所在數據庫的字符集為準。 collate 校驗規則&#xff0c;如果沒有指定校驗規則&#xff0c;則以…

MySQL系列(二)——日志篇

MySQL日志 主要包括錯誤日志、查詢日志、慢查詢日志、事務日志、二進制日志幾大類。其中&#xff0c;比較重要的還要屬二進制日志binlog&#xff08;歸檔日志&#xff09;和事務日志redo log&#xff08;重做日志&#xff09;和undo log&#xff08;回滾日志&#xff09;。 今…

windows批處理腳本(.bat)如何激活Anconda Prompt虛擬環境

通過call 來調用激活腳本&#xff0c; activate myenv指的是要激活的環境&#xff0c;若省略&#xff0c;則激活的是base環境。 call : 從另一個批處理程序調用一個批處理程序&#xff0c;而不停止父批處理程序。 call C:\ProgramData\Anaconda3\Scripts\activate.bat activate…

fastdds共享內存實現原理

fastdds 共享內存分兩個部分&#xff0c;一部分用于保存數據&#xff0c;一部分用于通信。 fastrtps_“UUID”:共享內存包括又兩部分數據&#xff0c;BufferNode和segment_size, 用配置文件port_queue_capacity_指定BufferNode的數量&#xff0c;segment_size用于保存實際傳輸的…

imp導入數據發現的

遷移歷史數據到歷史庫&#xff0c;因為災備數據中心使用的DG&#xff0c;無法使用數據泵&#xff0c;只能通過exp導出&#xff0c;然后再通過imp導入 為防止undo表空間壓力過大&#xff0c;在導入時imp使用了commit參數及buffer參數 這次導入數據量達到1TB&#xff0c;剛到了1/…

智物發布MT6877平臺無線AR智能眼鏡參考設計,推動下一代無線AR發展

隨著增強現實(AR)技術的不斷發展&#xff0c;有線AR眼鏡在連接和使用方面存在一些限制。為了解決這些問題&#xff0c;無線AR智能眼鏡的推出勢在必行。 新一代無線AR智能眼鏡采用了天璣900&#xff08;MT6877&#xff09;平臺作為參考設計&#xff0c;搭載了2.4GHz的八核處理器…

【rabbitMQ】Exchanges交換機

上一篇&#xff1a;springboot整合rabbitMQ模擬簡單收發消息 https://blog.csdn.net/m0_67930426/article/details/134904766 本篇代碼基于上一篇繼續寫 目錄 Fanout 交換機 1. add queue 2. add Exchange 3.綁定隊列 Direct 交換機 1. add queue 2. add Exchange 3.…

011 數據結構_哈希

前言 本文將會向你介紹哈希概念&#xff0c;哈希方法&#xff0c;如何解決哈希沖突&#xff0c;以及閉散列與開散列的模擬實現 1. 哈希概念 順序結構以及平衡樹中&#xff0c;元素關鍵碼與其存儲位置之間沒有對應的關系&#xff0c;因此在查找一個元素時&#xff0c;必須要經…

CyclicBarrier、CountDownLatch、Semaphore 的用法

CyclicBarrier、CountDownLatch、Semaphore 的用法 CountDownLatch&#xff08;線程計數器 &#xff09; CountDownLatch 類位于 java.util.concurrent 包下&#xff0c;利用它可以實現類似計數器的功能。比如有一個任務 A&#xff0c;它要等待其他 4 個任務執行完畢之后才能執…

數據結構與算法-Rust 版讀書筆記-2線性數據結構-隊列

數據結構與算法-Rust 版讀書筆記-2線性數據結構-隊列 1、隊列&#xff1a;先進先出 隊列是項的有序集合&#xff0c;其中&#xff0c;添加新項的一端稱為隊尾&#xff0c;移除項的另一端稱為隊首。一個元素在從隊尾進入隊列后&#xff0c;就會一直向隊首移動&#xff0c;直到…

鴻蒙原生應用再添新丁!同花順入局鴻蒙

鴻蒙原生應用再添新丁&#xff01;同花順入局鴻蒙 來自 HarmonyOS 微博12月11日消息&#xff0c;同花順已完成#鴻蒙原生應用#beta版本&#xff0c;并正在進行全量版本開發&#xff0c;進一步豐富了#鴻蒙原生應用#的覆蓋領域。同花順作為股民和券商首選的一站式金融理財服務平臺…

擴展學習|商業智能和分析:從大數據到大影響

文獻來源&#xff1a;Chen H, Chiang R H L, Storey V C. Business intelligence and analytics: From big data to big impact[J]. MIS quarterly, 2012: 1165-1188. 下載鏈接&#xff1a;https://pan.baidu.com/s/1JoHcTbwdc1TPGnwXsL4kIA 提取碼&#xff1a;a8uy 在不同的組…

MySQL忘記密碼

根據提供的引用內容&#xff0c;當使用root用戶登錄MySQL時&#xff0c;如果密碼錯誤&#xff0c;會出現"Access denied for user ‘root’‘localhost’ (using password: NO)"的錯誤提示。這個錯誤提示表示使用了錯誤的密碼或者沒有輸入密碼就嘗試登錄MySQL。解決這…

SQL命令---查看數據庫表

介紹 使用sql命令查看數據表。 命令 show create table 表名\G;\G&#xff1a;使顯示結果整齊美觀。