LeetCode題練習與總結:尋找旋轉排序數組中的最小值--153

一、題目描述

已知一個長度為?n?的數組,預先按照升序排列,經由?1?到?n?次?旋轉?后,得到輸入數組。例如,原數組?nums = [0,1,2,4,5,6,7]?在變化后可能得到:

  • 若旋轉?4?次,則可以得到?[4,5,6,7,0,1,2]
  • 若旋轉?7?次,則可以得到?[0,1,2,4,5,6,7]

注意,數組?[a[0], a[1], a[2], ..., a[n-1]]?旋轉一次?的結果為數組?[a[n-1], a[0], a[1], a[2], ..., a[n-2]]?。

給你一個元素值?互不相同?的數組?nums?,它原來是一個升序排列的數組,并按上述情形進行了多次旋轉。請你找出并返回數組中的?最小元素?。

你必須設計一個時間復雜度為?O(log n)?的算法解決此問題。

示例 1:

輸入:nums = [3,4,5,1,2]
輸出:1
解釋:原數組為 [1,2,3,4,5] ,旋轉 3 次得到輸入數組。

示例 2:

輸入:nums = [4,5,6,7,0,1,2]
輸出:0
解釋:原數組為 [0,1,2,4,5,6,7] ,旋轉 3 次得到輸入數組。

示例 3:

輸入:nums = [11,13,15,17]
輸出:11
解釋:原數組為 [11,13,15,17] ,旋轉 4 次得到輸入數組。

提示:

  • n == nums.length
  • 1 <= n <= 5000
  • -5000 <= nums[i] <= 5000
  • nums?中的所有整數?互不相同
  • nums?原來是一個升序排序的數組,并進行了?1?至?n?次旋轉

二、解題思路

這個問題是典型的二分查找的變種問題。由于原數組是升序排列的,即使經過旋轉,數組也被分成了兩個有序的部分。最小值就是這兩個部分的分界點。

以下是解決這個問題的步驟:

1. 初始化兩個指針,left指向數組的起始位置,right指向數組的末尾。

2. 進行二分查找,計算中間位置mid

3. 檢查mid位置的值是否是最小值,或者通過比較midright位置的值來確定最小值是在左半部分還是右半部分。

  • 如果nums[mid] > nums[right],說明最小值在mid的右側,設置left = mid + 1
  • 否則,最小值在mid的左側或就是mid,設置right = mid

4. 當left等于right時,找到了最小值,返回nums[left]nums[right]

三、具體代碼

class Solution {public int findMin(int[] nums) {int left = 0, right = nums.length - 1;while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] > nums[right]) {left = mid + 1;} else {right = mid;}}return nums[left];}
}

四、時間復雜度和空間復雜度

1. 時間復雜度
  • 我們使用了一個while循環,該循環的每次迭代都會將搜索區間減半。
  • 在每次迭代中,我們只做常數時間的工作,即計算mid、比較和賦值。
  • 因此,循環會運行log n次,其中n是數組的長度。
  • 綜上,時間復雜度是O(log n)。
2. 空間復雜度
  • 該算法只使用了幾個變量(left, right, mid),不管輸入數組的大小如何,所使用的額外空間都保持不變。
  • 因此,空間復雜度是O(1),即常數空間復雜度。

五、總結知識點

1. 二分查找(Binary Search):

  • 二分查找是一種高效的查找算法,它將查找區間分成兩半,每次比較中間元素與目標值,根據比較結果選擇左半區間或右半區間繼續查找,直到找到目標值或區間為空。
  • 在這個問題中,二分查找被用于找到旋轉數組中的最小值,即使數組被旋轉,我們也可以通過比較中間元素和最右側元素來確定最小值是在左半部分還是右半部分。

2. 循環(Loop):

  • 使用了一個while循環來實現二分查找。循環的條件是左指針小于右指針,這表示查找區間非空。

3. 整數運算(Integer Operations):

  • 計算中間位置mid時使用了整數除法和加法。為了避免整數溢出,使用了(left + (right - left) / 2)而不是(left + right) / 2

4. 數組操作(Array Operations):

  • 通過索引訪問數組元素,比較數組中不同位置的值。

5. 遞歸與迭代(Recursion and Iteration):

  • 雖然這段代碼使用的是迭代方法,但二分查找也可以用遞歸方式實現。在這個問題中,迭代是更常見和更高效的實現方式。

6. 算法設計技巧(Algorithm Design Techniques):

  • 利用數組的局部有序性質來減少查找范圍,這是分治策略的一個例子。

以上就是解決這個問題的詳細步驟,希望能夠為各位提供啟發和幫助。

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

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

相關文章

【MIT 6.5840/6.824】Lab1 MapReduce

MapReduce MapReduce思想實現思路感受 6.5840/6.824 Lab與筆記匯總 本文對應的Lab版本為MIT6.5840-Spring2024的Lab1 本博客只提供思路&#xff0c;不會公開任何代碼 本lab耗時約6h&#xff0c;碼量約500行 MapReduce思想 MapReduce的思想屬于是比較簡單的&#xff0c;分為兩…

3. 排序算法代碼-python

目錄 1.冒泡排序2.快速排序3.插入排序4.希爾排序5.選擇排序6.堆排序7.歸并排序8. 二分查找 1.冒泡排序 冒泡排序""" def BubbleSort(nums):listLength len(nums)while listLength > 0:for i in range(listLength - 1):if nums[i] > nums[i1]:nums[i], n…

References in code to package

【IntelliJ IDEA】IDE學習使用&#xff08;不時更新&#xff09;_idea references in code to class-CSDN博客

【筆記】從零開始做一個精靈龍女-畫貼圖階段(上)

此文只是我的筆記&#xff0c;不包全看懂&#xff0c;有問題可評論 PS貼圖加工 1.打開ps 拖入uv圖&#xff0c;新建圖層&#xff0c;設置背景色為灰色&#xff0c;改一下圖層名字 2.按z縮小一下uv圖層&#xff0c;拖入實體uv圖片&#xff08;目的是更好上色&#xff0c;比如…

鴻蒙語言基礎類庫:【@ohos.util.Vector (線性容器Vector)】

線性容器Vector 說明&#xff1a; 本模塊首批接口從API version 8開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。開發前請熟悉鴻蒙開發指導文檔&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md點擊或者復制轉到。 Vect…

云原生(Cloud native)

云原生&#xff08;Cloud native&#xff09; 一 定義 目前比較權威的定義主要來自Pivotal公司和云原生計算基金會&#xff08;Cloud Native Computing Foundation&#xff0c;簡稱CNCF&#xff09;。 1.1 Pivotal 4個要點&#xff1a; DevOps、持續交付、微服務、容器化。六…

【Java后端】Service層讀取yml配置文件中內容

前言 最近寫代碼&#xff0c;看到別人寫的讀取application.yml配置文件中數據&#xff0c;寫的挺規范&#xff0c;挺好的&#xff1b;雖然之前也讀取過yml文件&#xff0c;但用的其他方法&#xff0c;沒這個規范&#xff0c;所以記錄下 正文 假設要讀取視頻地址&#xff0c;…

微信小程序切換商戶號

1.登錄微信公眾平臺小程序 2.功能->微信支付 3.關聯成功后會志一關聯商戶號列表顯示 4.登錄你需要切換的商戶號 在下面選擇你需要開通的產品服務 5.切換到賬戶中心的api安全里面 只需要改變當前下面的配置即可切換小程序的收款商戶號 申請API證書按照官方的指引即可解…

關于redis的運維面試題-2

21. Redis的客戶端連接數限制如何設置&#xff1f; 在Redis中&#xff0c;客戶端連接數的限制可以通過配置文件redis.conf來設置&#xff0c;也可以通過命令行直接設置。以下是如何通過配置文件和命令行來設置Redis客戶端連接數限制的步驟和示例代碼。 通過配置文件設置客戶端…

JS計算某一年的土地租金收入和土地承租支出

涉及到多年的地租 , 例如 2024年5月15日 - 2026年5月15日 , 總承包租金是60000 假設 當前年是2024年 , 則計算2024年5月15日-2024年12月31日的租金收入 , 如果是2025年則是2025年1月1日-2025年12月31日 //示例交易數據 var transactions [ { type: "轉出土地收益&qu…

怎么區分住宅IP還是機房IP?機房IP和住宅IP有哪些不同?

在網絡技術的應用中&#xff0c;IP地址扮演著至關重要的角色。了解IP地址的種類及其特性&#xff0c;對于進行網絡管理、優化網絡安全策略、以及實施數據分析等任務至關重要。本文將深入探討如何區分住宅IP和機房IP&#xff0c;并分析兩者的主要差異。 一、IP地址分類簡介 IP…

pytorch-RNN存在的問題

這里寫目錄標題 1. RNN存在哪些問題呢&#xff1f;1.1 梯度彌散和梯度爆炸1.2 RNN為什么會出現梯度彌散和梯度爆炸呢&#xff1f; 2. 解決梯度爆炸方法3. Gradient Clipping的實現4. 解決梯度彌散的方法 1. RNN存在哪些問題呢&#xff1f; 1.1 梯度彌散和梯度爆炸 梯度彌散是…

【人工智能】深度學習:神經網絡模型

【人工智能】深度學習&#xff1a;神經網絡模型 神經網絡基礎知識 BP神經網絡的概念 單個神經元的結構 CNN模型匯總 LeNet5 模型 AlexNet 模型 VGG模型 Inception Net&#xff08;GoogleNet&#xff09;模型 ResNet &#xff08;殘差網絡&#xff09; RNN模型&#x…

css實現漸進中嵌套漸進的方法

這是我們想要的實現效果&#xff1a; 思路&#xff1a; 1.有一個底色的背景漸變 2.需要幾個小的塊級元素做絕對定位通過漸變filter模糊來實現 注意&#xff1a;這里的采用的定位方法&#xff0c;所以在內部的元素一律要使用絕對定位&#xff0c;否則會出現層級的問題&…

小白攻克歌曲“無名的人”,逐句精研的歌唱訣竅

《無名的人》 作詞&#xff1a;唐恬 作曲&#xff1a;錢雷 演唱&#xff1a;毛不易 今天不講解練習技巧&#xff0c;有需要的可以查看往期文章&#xff0c;我給大家帶一下無名的人&#xff0c;練習一下情感融入。 對于眾多唱歌小白而言&#xff0c;學習歌曲《無名的人》是一…

ctfshow-web入門-文件上傳(web164、web165)圖片二次渲染繞過

web164 和 web165 的利用點都是二次渲染&#xff0c;一個是 png&#xff0c;一個是 jpg 目錄 1、web164 2、web165 二次渲染&#xff1a; 網站服務器會對上傳的圖片進行二次處理&#xff0c;對文件內容進行替換更新&#xff0c;根據原有圖片生成一個新的圖片&#xff0c;這樣…

【Linux】進程優先級 + 環境變量

前言 在了解進程狀態之后&#xff0c;本章我們將來學習一下進程優先級&#xff0c;還有環境變量等。。 目錄 1.進程優先級1.1 為什么要有優先級&#xff1f; 2.進程的其他概念2.1 競爭性與獨立性2.2 并行與并發2.3 進程間優先級的體現&#xff1a;2.3.1 O(1) 調度算法&#xf…

Apache Web安全分析與增強

Apache HTTP Server 概述 Apache HTTP Server(通常簡稱為Apache)是一個開源的Web服務器軟件,由Apache軟件基金會開發和維護。它是全球使用最廣泛的Web服務器之一,支持多種操作系統,包括Unix、Linux、Windows和Mac OS X。以下是Apache Web服務器的詳細概述,包括其功能特點…

數字高壓表0-30kv

最近在制作數字高壓表&#xff0c;自己DIY玩玩&#xff0c;有沒有朋友一起研究看看

SpringCloud--常用組件和服務中心

常用組件 Euroke和nacos 區別 負載均衡 負載均衡策略有哪些 自定義負載均衡策略