劍指offer - 面試題11 旋轉數組的最小數字

題目鏈接:旋轉數組的最小數字

第一種:正確寫法(num[m]和nums[r]比較)

class Solution {
public:/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可** * @param nums int整型vector * @return int整型*/int minNumberInRotateArray(vector<int>& nums) {// write code hereint l = 0, m = 0, r = nums.size() - 1;while (l < r) { // 將結果框在[l,r]的范圍內,因此當l==r時,代表就是結果m = (l + r) / 2; // 此處在l=r-1時要注意死循環,因為循環條件時l < r,如果在l根據m改變時,必須給l賦值m+1,因為直接賦值為m就會導致死循環。(此處只需要注意l=m+1,而r=m是可以的,這是因為(l+r)/2的結果可能等于l,但不可能等于r)if (nums[m] > nums[r]) {l = m + 1; // 說明m是在第一個上升數組中,且m不可能是最小值,所以m這個位置不需要保留,同時為了避免死循環,l=m+1而不是l=m} else if (nums[m] < nums[r]) {r = m; // 說明m是在第二個上升數組中,且m有可能是結果的位置,因此m必須要保留,r=m而不是r=m-1} else {r--; // 此處就是第一次沒想到的解法,當nums[m] == nums[r]時,沒法確定是第一個還是第二個上升數組,但能確定的是,r這個位置可以不要了,因為有m在保留著結果(m不可能等于r,因為如果m==r的話,說明l==r,那么循環就走不到這里了。為了縮小結果集范圍,直接r--就可以了)}}return nums[l];}
};

但是很神奇的是,上面的代碼都是和num[r]比較的,但如果像下面這么寫,有些用例就是失敗的
第二種錯誤寫法:nums[m]和num[l]比較

class Solution {
public:/*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可** * @param nums int整型vector * @return int整型*/int minNumberInRotateArray(vector<int>& nums) {// write code hereint l = 0, m = 0, r = nums.size() - 1;while (l < r) {m = (l + r) / 2;if (nums[m] > nums[l]) {l = m + 1;} else if (nums[m] < nums[l]) {r = m;} else {l++;}}return nums[l];}
};

上面的代碼表明看起來是對的,但這段代碼只能通過部分用例。

因為存在特殊情況,即在旋轉0個數字情況下,nums[m]是一定會大于num[l],此時按照上面的代碼,l=m+1,l會越加越多,離正確答案nums[0]越來越遠了。

因此這就是為什么要按照第一種寫法,nums[m]和num[r]進行比較。在旋轉0個數字這種特殊情況,nums[m]<num[r]是永遠成立的,此時的操作正好是r = m,就不會錯過正確答案。
例如[1,0,1,1,1]這個輸入,nums[m]和nums[l]比較這個上面的第二種代碼就是錯誤的。
第一輪l=0,r=4,m=2。此時nums[l]==nums[r],因此l++
第二輪l=1,r=4,m=2。此時[l,r]就是[0,1,1,1]這個升序的序列了,就是上面所說的特殊場景,nums[m] > nums[l],按照第二種代碼的邏輯,l = m+1,l=3。這樣直接就把正確答案跳過去了。

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

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

相關文章

Spring源碼分析の循環依賴

文章目錄 前言一、循環依賴問題二、循環依賴的解決三、整體流程分析 前言 常見的可能存在循環依賴的情況如下&#xff1a; 兩個bean中互相持有對方作為自己的屬性。 ??類似于&#xff1a; 兩個bean中互相持有對方作為自己的屬性&#xff0c;且在構造時就需要傳入&#xff1a…

Docker 部署 Jenkins持續集成(CI)工具

[TOC](Docker 部署 Jenkins持續集成(CI)工具) 前言 Jenkins 是一個流行的開源自動化工具&#xff0c;廣泛應用于持續集成&#xff08;CI&#xff09;和持續交付&#xff08;CD&#xff09;的環境中。通過 Docker 部署 Jenkins&#xff0c;可以簡化安裝和配置過程&#xff0c;并…

《Effective Objective-C》閱讀筆記(中)

目錄 接口與API設計 用前綴避免命名空間沖突 提供“全能初始化方法” 實現description方法 盡量使用不可變對象 使用清晰而協調的命名方式 方法命名 ?編輯類與協議命名 為私有方法名加前綴 理解OC錯誤模型 理解NSCopying協議 協議與分類 通過委托與數據源協議進行…

C++程序員內功修煉——Linux C/C++編程技術匯總

在軟件開發的宏大版圖中&#xff0c;C 語言宛如一座巍峨的高山&#xff0c;吸引著無數開發者攀登探索。而 Linux 操作系統&#xff0c;以其開源、穩定、高效的特性&#xff0c;成為了眾多開發者鐘愛的開發平臺。將 C 與 Linux 相結合&#xff0c;就如同為開發者配備了一把無堅不…

數據庫索引:缺點與類型全解析

在數據庫的世界里&#xff0c;索引就像是一本書的目錄&#xff0c;它能幫助我們快速定位到所需的數據&#xff0c;極大地提升查詢效率。然而&#xff0c;就如同任何事物都有兩面性一樣&#xff0c;索引也并非完美無缺。今天&#xff0c;我們就來深入探討一下索引的缺點以及常見…

【python】提取word\pdf格式內容到txt文件

一、使用pdfminer提取 import os import re from pdfminer.high_level import extract_text import docx2txt import jiebadef read_pdf(file_path):"""讀取 PDF 文件內容:param file_path: PDF 文件路徑:return: 文件內容文本"""try:text ext…

嵌入式八股文(五)硬件電路篇

一、名詞概念 1. 整流和逆變 &#xff08;1&#xff09;整流&#xff1a;整流是將交流電&#xff08;AC&#xff09;轉變為直流電&#xff08;DC&#xff09;。常見的整流電路包括單向整流&#xff08;二極管&#xff09;、橋式整流等。 半波整流&#xff1a;只使用交流電的正…

精選案例展 | 智己汽車—全棧可觀測驅動智能化運營與成本優化

本案例為“觀測先鋒 2024 可觀測平臺創新應用案例大賽”精選案例&#xff0c;同時榮獲IT168“2024技術卓越獎評選-年度創新解決方案”獎。 項目背景 近年來&#xff0c;中國汽車行業進入轉型升級階段&#xff0c;智能網聯技術成為行業發展的核心。車聯網、自動駕駛等技術的加速…

速通HTML

目錄 HTML基礎 1.快捷鍵 2.標簽 HTML進階 1.列表 a.無序列表 b.有序列表 c.定義列表 2.表格 a.內容 b.合并單元格 3.表單 a.input標簽 b.單選框 c.上傳文件 4.下拉菜單 5.文本域標簽 6.label標簽 7.按鈕標簽 8.無語義的布局標簽div與span 9.字符實體 HTML…

【Python模塊】——pymysql

pymysql是python操作mysql的標準庫&#xff0c;可以通過pip install快速導入pymysql包操作數據庫 使用pymysql操作mysql 簡單demo import pymysql connect pymysql.connect(host"localhost",port3306,user"root",password"root",database&quo…

IP離線庫助力破解網絡反詐難題

毫秒級響應識別異常訪問 IP離線庫集成全球全量IP地址的詳細信息&#xff0c;包括地理地址查詢、運營商、經緯度、代理識別等多種維度數據。例如&#xff1a; 當用戶賬號頻繁從北京、越南等多地IP登錄時&#xff0c;系統將自動觸發風險預警&#xff1b; 檢測到訪問IP為已知機…

lattice hdl實現spi接口

在lattice工具鏈中實現SPI接口通常涉及以下步驟: 定義硬件SPI接口的管腳。配置SPI時鐘和模式。編寫SPI主機或從機的控制邏輯。 展示了如何在Lattice工具鏈中使用HDL語言(例如Verilog)來配置SPI接口: lattice工程 頂層:spi_slave_top.v `timescale 1ns/ 1ps module spi_…

Spring 循環依賴解析與解決方案

文章目錄 1. 什么是循環依賴&#xff1f;1.1 概念解析1.2 示例代碼 2. 循環依賴的類型2.1 構造器循環依賴&#xff08;不可解決 ?&#xff09;2.2 Setter 方式或 Autowired 方式的循環依賴&#xff08;可解決 ?&#xff09; 3. 解決循環依賴的方式3.1 方式一&#xff1a;使用…

Cesium@1.126.0,創建3D瓦片,修改樣式

第一步&#xff1a;添加3D建筑 Cesium.createOsmBuildingsAsync()這是一個異步方法&#xff0c;所以要寫在一個異步函數里 創建一個函數 const create3DBuilding async (viewer) > {try {// 添加3D建筑const tileset await Cesium.createOsmBuildingsAsync();viewer.scen…

力扣-貪心-1005 k次取反后最大化的數組和

思路 找到絕對值最大的&#xff0c;然后如果是負數就變成正的&#xff0c;所有數遍歷完之后&#xff0c;有兩種情況&#xff0c;一種是k已經為0了&#xff0c;不需要再取反了&#xff0c;一種是所有數都為正數&#xff0c;k不為0&#xff0c;此時對絕對值最小的數操作即可 代…

vue2項目打包后js文件過大, 首次加載緩慢

vue2項目打包后js文件過大, 首次加載緩慢 安裝插件 npm i compression-webpack-plugin6.1.1 -D配置vue.config.js const CompressionWebpackPlugin require(compression-webpack-plugin)module.exports {configureWebpack: {plugins:[new CompressionWebpackPlugin({filen…

高級SQL技術在Python項目中的應用:ORM與深度性能優化

引言 在現代Python項目開發中,數據庫交互遠不止是數據的簡單存取,它已成為構建高性能、可維護應用的核心瓶頸和關鍵能力所在。 僅僅依賴基礎SQL查詢,雖然入門簡單,卻難以應對日益增長的應用挑戰。這些挑戰主要體現在以下幾個方面: 性能瓶頸: 數據量劇增: 從百萬到數十億乃…

基于 C++ Qt 的 Fluent Design 組件庫 QFluentWidgets

簡介 QFluentWidgets 是一個基于 Qt 的 Fluent Designer 組件庫&#xff0c;內置超過 150 個開箱即用的 Fluent Designer 組件&#xff0c;支持亮暗主題無縫切換和自定義主題色。 編譯示例 以 Qt5 為例&#xff08;Qt6 也支持&#xff09;&#xff0c;將 libQFluentWidgets.d…

抖音視頻如何下載保存去水印

隨著短視頻平臺的興起&#xff0c;抖音作為國內最受歡迎的短視頻平臺之一&#xff0c;吸引了大量用戶上傳和觀看各種創意視頻。許多用戶在瀏覽抖音視頻時&#xff0c;往往會想要保存一些有趣或精彩的視頻片段&#xff0c;但抖音視頻通常會有水印&#xff0c;影響觀看體驗。為了…

React 源碼揭秘 | 更新隊列

前面幾篇遇到updateQueue的時候&#xff0c;我們把它先簡單的當成了一個隊列處理&#xff0c;這篇我們來詳細討論一下這個更新隊列。 有關updateQueue中的部分&#xff0c;可以見源碼 UpdateQueue實現 Update對象 我們先來看一下UpdateQueue中的內容&#xff0c;Update對象&…