python-Leetcode 65.搜索旋轉排序數組

題目:

整數數組nums按升序排列,數組中的值互不相同

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

給定旋轉后的數組nums和一個整數target,如果nums中存在這個目標值target,則返回它的小標,否則返回-1


方法一:二分查找

對于有序數組,可以使用二分查找的方法查找元素

這道題中,數組本身不是有序的,進行旋轉后只保證了數組的局部是有序的

可以發現,將數組從中間分開成左右兩部分,一定有一部分的數組是有序的,拿示例看,從?6?這個位置分開以后數組變成了?[4, 5, 6]?和?[7, 0, 1, 2]?兩個部分,其中左邊?[4, 5, 6]?這個部分的數組是有序的,其他也是如此。

這啟示我們,可以在常規二分查找的時候查看當前mid為分割位置分割出來的兩個部分[l, mid]?和?[mid + 1, r]哪個部分是有序的并根據有序的那個部分確定該如何改變二分查找的上下界,因為可以根據有序的部分判斷出target在不在這個部分。

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

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

class Solution(object):def search(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""if not nums:  #如果輸入數組為空,直接返回-1表示未找到return -1l,r=0,len(nums)-1  #初始化兩個指針l(left)和r(right),分別指向數組的開始和結束位置while l<=r: #開始二分查找循環,當左指針不超過右指針時繼續循環mid=(l+r)//2  #計算中間位置midif nums[mid]==target: #如果中間值正好等于目標值,直接返回中間索引return midif nums[0]<=nums[mid]:#檢查數組的左半部分是否有序(旋轉點在mid右側)if nums[0]<=target<nums[mid]: #如果目標值在有序的左半部分范圍內,將右指針移到mid左側r=mid-1else:l=mid+1  #否則目標值在右半部分,將左指針移到mid右側else: #如果左半部分無序(旋轉點在mid左側),則右半部分必定有序if nums[mid]<target<=nums[len(nums)-1]:#如果目標值在有序的右半部分范圍內,將左指針移到mid右側l=mid+1else:    #否則目標值在左半部分,將右指針移到mid左側r=mid-1return -1

時間復雜度:O(logn),其中?n?為?nums?數組的大小。整個算法時間復雜度即為二分查找的時間復雜度?O(logn)

空間復雜度:?O(1)

源自力扣官方題解
?

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

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

相關文章

學透Spring Boot — 010. 單元測試和Spring Test

系列文章目錄 這是CSDN postnull 博客《學透Spring Boot》系列的一篇&#xff0c;更多文章請移步&#xff1a;Postnull - 學透Spring Boot系列文章 文章目錄 系列文章目錄前言1. 基本概念UT 單元測試TDD 測試驅動開發UT測試框架Mock框架 3. Spring Test為什么要用Spring Test引…

Chrome 135 版本新特性

Chrome 135 版本新特性 一、Chrome 135 版本瀏覽器更新 ** 1. 第三方托管賬戶注冊遷移到 OIDC 授權碼流程** Chrome 135 將賬戶注冊的登錄頁面從營銷網站遷移到動態網站&#xff0c;同時也將 OpenID Connect (OIDC) 的隱式流程遷移到授權碼流程。這樣做的目的是進一步提升第…

Docker Swarm集群搭建與管理全攻略

文章目錄 一、節點準備二、初始化 manager 節點三、管理 swarm 集群中的 worker 節點1、添加 worker 節點2、查看 worker 節點3、刪除 worker 節點 四、管理 swarm 集群服務1、創建服務2、查看服務3、刪除服務 五、管理 swarm 節點服務1、節點標簽管理2、創建服務3、查看服務4、…

離線語音識別 ( 小語種國家都支持)可定制詞組

1產品介紹 離線語音模組采用神經網絡算法&#xff0c;支持語音識別、自學習等功能。運用此模組將 AI 技 術賦能產品&#xff0c;升級改造出語音操控的智能硬件 ( 例如風扇、臺燈、空調、馬桶、按摩椅、運 動相機、行車記錄儀等 ) 。支持全球多種語言識別&#xff0c;如中文…

Docker與VNC的使用

https://hub.docker.com/r/dorowu/ubuntu-desktop-lxde-vnc 下載nvc 客戶端 https://downloads.realvnc.com/download/file/viewer.files/VNC-Viewer-7.12.0-Windows.exe 服務端 docker pull dorowu/ubuntu-desktop-lxde-vnc#下載成功 docker pull dorowu/ubuntu-desktop-l…

Linux系統學習Day0——了解和熟悉Linux系統的遠程終端登錄和數據傳輸

一、Windows系統與Linux系統虛擬機通過橋接進行網絡連接 &#xff08;一&#xff09;橋接模式 橋接模式是虛擬機網絡連接的一種常見方式&#xff0c;其核心原理是通過虛擬網卡將Linux虛擬機與宿主機的物理網卡建立橋接關系&#xff0c;使虛擬機能夠直接接入物理網絡。在該模式…

【開題報告+論文+源碼】基于springboot的農貿菜市場租位管理系統的設計與實現

項目背景與意義 隨著信息技術的快速發展和普及&#xff0c;信息化管理已成為各行業提升運營效率和服務質量的重要手段。農貿菜市場作為城市生活的重要組成部分&#xff0c;其管理效率和服務水平直接關系到市民的日常生活體驗。傳統的農貿菜市場租位管理方式往往存在信息不對稱、…

Codecademy—— 交互式編程學習的樂園

一、網站概述 Codecademy 是一家美國在線學習編程知識的網站&#xff0c;它為編程學習者提供了一種全新的學習方式。在如今眾多的編程學習平臺中&#xff0c;Codecademy 憑借其獨特的優勢脫穎而出&#xff0c;吸引了全球數百萬用戶。其目標是幫助更多人輕松學習編程&#xff0…

WEB安全--XSS--DOM破壞

一、前言 繼XSS基礎篇后&#xff0c;我們知道了三種類型的XSS&#xff0c;這篇文章主要針對DOM型XSS的原理進行深入解析。 二、DOM型XSS原理 2.1、什么是DOM 以一個形象的比喻&#xff1a; 網頁就像是一座房子&#xff0c;而 **DOM** 就是這座房子的“藍圖”或者“結構圖”。…

Linux系統遠程操作和程序編譯

Linux系統遠程操作和程序編譯 了解和熟悉Linux系統的遠程終端登錄、遠程圖形桌面訪問、 X圖形窗口訪問和FTP文件傳輸操作 網絡設置和用戶創建&#xff1a; 在虛擬機Ubuntu系統中&#xff0c;將網絡連接設置為“橋接模式”&#xff0c;并配置好IP和網關。確保其他Windows 10系統…

linux開發環境

1.虛擬機環境搭建 在 Ubuntu 系統中&#xff0c;打開&#xff08;如圖中顯示的窗口 &#xff09;常見快捷鍵有&#xff1a; Ctrl Alt T&#xff1a;這是最常用的打開終端的快捷鍵組合 &#xff0c;按下后會快速彈出一個新的終端窗口。 在 VMware 虛擬機環境中&#xff0c;若…

藍橋·20264-祝福語--找連續字串的長度

#include <iostream> using namespace std; int main() {// 請在此輸入您的代碼//最小字典序&#xff0c;一定是全a&#xff0c;找s的最長字串a,結果就是該字串長度加1&#xff08;t不能是s的子串&#xff09;//所以這道題就變成了&#xff0c;找s中字串a出現的長度strin…

7.第二階段x64游戲實戰-分析人物屬性

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 上一個內容&#xff1a;6.第二階段x64游戲實戰-分析人物狀態 首先打開人物面板&#xff0c;查看人物的…

數組的常見算法一

注: 本文來自尚硅谷-宋紅康僅用來學習備份 6.1 數值型數組特征值統計 這里的特征值涉及到&#xff1a;平均值、最大值、最小值、總和等 **舉例1&#xff1a;**數組統計&#xff1a;求總和、均值 public class TestArrayElementSum {public static void main(String[] args)…

汽車電子筆記之:基于Tasking編譯器怎么制作庫文件并將庫文件集成進工程釋放

目錄 1、概述 2、庫工程創建、使用步驟 2.1、選擇對應的MCU型號及空工程 2.2、選擇需要封裝的代碼 2.3、將需要封裝的代碼復制到庫工程 2.4、整理庫工程工程屬性 2.5、預留不生成庫的.c源文件 2.6、編譯生成.a文件 2.7、將.a集成進工程 2.7.1、創建釋放給客戶的工程 …

[ctfshow web入門] web29

前置知識 eval: 把字符串按照 PHP 代碼來執行&#xff0c;例如eval(“echo 1;”);這個函數擁有回顯 system&#xff1a;使php程序執行系統命令&#xff0c;例如&#xff0c;system(“ls”);就是查看當前目錄&#xff0c;這個擁有回顯 preg_match&#xff1a;查找字符串是否匹配…

7-8 超速判斷

模擬交通警察的雷達測速儀。輸入汽車速度&#xff0c;如果速度超出60 mph&#xff0c;則顯示“Speeding”&#xff0c;否則顯示“OK”。 輸入格式&#xff1a; 輸入在一行中給出1個不超過500的非負整數&#xff0c;即雷達測到的車速。 輸出格式&#xff1a; 在一行中輸出測…

【GESP】C++二級練習 luogu-B3721 [語言月賽202303] Stone Gambling S

GESP二級練習&#xff0c;多層循環分支練習&#xff0c;難度★?☆☆☆。 題目題解詳見&#xff1a;https://www.coderli.com/gesp-2-luogu-b3721/ 【GESP】C二級練習 luogu-B3721 [語言月賽202303] Stone Gambling S | OneCoderGESP二級練習&#xff0c;多層循環分支練習&am…

深入理解C++面向對象特性之一 多態

歡迎來到干貨小倉庫&#xff0c;堪比沙漠!!! 從“Hello World”到改變世界&#xff0c;中間隔著千萬次再試一次. 1.多態的概念 多態的概念&#xff1a;通俗來說&#xff0c;就是多種形態&#xff0c; 具體點就是去完成某個行為&#xff0c;當不同的對象去完成時會 產生出不同的…

藍橋備賽指南(14):樹的直徑與重心

樹的直徑 什么是樹的直徑&#xff1f;樹的直徑是樹上最長的一條鏈&#xff0c;當然這條鏈并不唯一&#xff0c;所以一棵樹可能有多條直徑。直徑由兩個頂點u、v來決定&#xff0c;若由一條直徑&#xff08;u,v)&#xff0c;則滿足一下性質&#xff1a; 1&#xff09;u、v的度數…