每日一題——旋轉數組的最小數字(II)

旋轉數組的最小數字——II

題目鏈接

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-HfqanL7d-1691934029415)(C:\Users\HUASHUO\AppData\Roaming\Typora\typora-user-images\image-20230813204334548.png)]

注:此題是昨天旋轉數組的最小數字——I的拓展延伸,昨天題目數組的條件是不會存在重復元素,而本題數組的元素可以重復,因此建議先做前面一題,進行思考,這樣求解這一題的過程就會容易理解許多。


旋轉數組的性質

由旋轉數組的最小數字——I我們知道了:

以數組最右側數據val為參考對象,最小值右側的數一定小于val,最小值左邊的數一定大于val

可以得到以下圖像:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1LUqxiEc-1691934029415)(C:/Users/HUASHUO/AppData/Roaming/Typora/typora-user-images/image-20230813204903425.png)]

而今天這一題多了一個條件:數組中可能存在重復元素。我們需要考慮的情況又復雜了一點:

以數組最右側數據val為參考對象,最小值右側的數一定等于小于val,最小值左邊的數一定大于等于val

我們同樣用二分法來解決:

  • 同樣,我們設左邊界為left,右邊界為right,區間的中間下標為mid

  • 如果nums[mid] > nums[right],和原來一樣,最小值一定不在左側區域,left = mid + 1

  • 如果nums[mid] < nums[right],和原來一樣,最小值一定不在右側區域(但可能就是mid位置的值),right = mid

  • 如果nums[mid]==nums[rihgt],這種情況就值得注意了,如下圖:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-uNuvbIY4-1691934029416)(C:/Users/HUASHUO/AppData/Roaming/Typora/typora-user-images/image-20230813210527291.png)]

  • 此時,nums[mid]可能在最小值的左邊,也可能在最小值的右邊,因此我們不能隨意地舍去mid左側的數據或者右側的數據。對于這種情況的處理,我們有兩種方法:

方法一:

不能隨意舍去mid左半部分或者右半部分是因為最小值到底是在mid的左邊還是右邊是不確定的,但是如果我們可以通過處理來確定最小值和mid的關系呢?

我們知道,數組旋轉后,其被分割成了兩串非遞減數列,而令我們困擾的就是諸如這種情況:[3,3,1,3],[4,4,5,1,4,4,4,4,4]。那么我們可以刪除數組前面所有等于nums[right]的元素,使數組變成諸如[1,3],[5,1,4,4,4,4]的形式,這樣當nums[mid]==nums[right]這種情況出現時,mid就一定會出現在最小值的右側mid右側的數據也就可以刪除了

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-unGjeYsq-1691934029416)(C:/Users/HUASHUO/AppData/Roaming/Typora/typora-user-images/image-20230813212421862.png)]

實現代碼

int minArray(int* nums, int numsSize){int left = 0;int right = numsSize - 1;//刪除數組前面所有等于nums[right]的元素while (left < numsSize && nums[left] == nums[right])left++;while (left < right){int mid = (right - left) / 2 + left;//如果中間值大于最右邊的值,那么最小值一定在中間值的右邊if (nums[mid] > nums[right])left = mid + 1;//否則,最小值就在最右邊的值的左邊,也可能就是這個中間值elseright = mid;}return nums[right];
}

方法二

雖然我們不能隨意舍棄mid的左半部分或者右半部分,但是我們可以確定,無論nums[right]是不是最小值,都有它的一個替代品nums[mid],因此我們可以刪除最右邊的數據nums[right]

實現代碼

int minArray(int* nums, int numsSize){int left = 0;int right = numsSize - 1;while (left < right){int mid = (right - left) / 2 + left;//如果中間值大于最右邊的值,那么最小值一定在中間值的右邊if (nums[mid] > nums[right])left = mid + 1;//如果中間值小于最右邊的值,那么最小值一定在中間值的左邊或者就是中間值else if (nums[mid] < nums[right])right = mid;//如果中間值等于最右邊的值,那么就刪除最右側元素else    right--;}return nums[left];
}

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

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

相關文章

【單片機畢業設計3-基于stm32c8t6的智能家居系統】

【單片機畢業設計3-基于stm32c8t6的智能家居系統】 前言一、功能介紹二、硬件部分三、軟件部分總結 前言 &#x1f525;這里是小殷學長&#xff0c;單片機畢業設計篇3 基于stm32的智能家居控制系統 &#x1f9ff;創作不易&#xff0c;拒絕白嫖&#xff08;有需可點擊最后鏈接&a…

Python自動化測試框架:Pytest和Unittest的區別

pytest和unittest是Python中常用的兩種測試框架&#xff0c;它們都可以用來編寫和執行測試用例&#xff0c;但兩者在很多方面都有所不同。本文將從不同的角度來論述這些區別&#xff0c;以幫助大家更好地理解pytest和unittest。 1. 原理 pytest是基于Python的assert語句和Pytho…

consul安裝啟動流程

普通軟件包安裝 首先cd /opt &#xff0c;將安裝包放到該目錄下 下載consul安裝包 進入consul官網找到自己開發平臺對應的安裝包下載 https://www.consul.io/downloads.html 或使用命令 wget https://releases.hashicorp.com/consul/1.6.2/consul_1.6.2_linux_amd64.zip (如果…

vue3 table動態合并,自定義參數合并單元格

<template><div><el-table :data"tableData" :span-method"objectSpanMethod" border:header-cell-style"{ textAlign: center}"><el-table-column prop"area" label"區域" align"center"&g…

HW樣本《關于“XXXX”微信視頻號發布短視頻的信息說明.exe》的逆向分析

一、概述 樣本運行后會釋放《關于“XXXX”微信視頻號發布短視頻的信息說明.doc》并打開&#xff1b;同時釋放ncloud.exe惡意文件并啟動&#xff1b;調用cmd命令刪除樣本母體&#xff1b;其中ncloud.exe會從互聯網下載類似字母表的數據解密出CS木馬&#xff0c;在內存加載并運行…

《玩轉Python數據分析專欄》大綱

歡迎來到《玩轉Python數據分析分類專欄》&#xff01;在這個專欄中&#xff0c;我們將帶您深入探索數據分析的世界&#xff0c;以Python為工具&#xff0c;解析各個領域的實際應用場景。通過100篇教程&#xff0c;我們將逐步引領您從入門級到高級&#xff0c;從基礎知識到實戰技…

前端安全:探秘安全 HTTP 頭的設置

在當今數字化時代&#xff0c;前端安全至關重要。除了應對常見的攻擊方式外&#xff0c;通過設置安全 HTTP 頭&#xff0c;我們可以加強網站的安全性&#xff0c;減少潛在的威脅。本文將為您詳細解釋什么是安全 HTTP 頭&#xff0c;以及如何通過設置它們來保護您的前端應用。 1…

真就逮住23屆了使勁薅唄,24屆笑了

作者&#xff1a;阿秀 InterviewGuide大廠面試真題網站&#xff1a;https://top.interviewguide.cn 小伙伴們大家好&#xff0c;我是阿秀。 最近在朋友圈看到不少動態說"24屆明顯好轉"的消息&#xff0c;也收到不少私信問是不是24屆的相比于23屆好多了&#xff0c;更…

深度學習階段性回顧

本文針對過去兩周的深度學習理論做階段性回顧&#xff0c;學習資料來自吳恩達老師的2021版deeplearning.ai課程&#xff0c;內容涵蓋深度神經網絡改善一直到ML策略的章節。視頻鏈接如下&#xff1a;吳恩達深度學習視頻鏈接 &#xff08;注&#xff1a;本文出自深度學習初學者&a…

Vue中如何更好地封裝組件?

子組件接受父組件傳遞的事件 1.子組件使用事件名"$emit(父組件中傳遞的事件名,想給父組件傳遞的參數(可選))" click"$emit(click)" 2.子組件使用 v-on"$listeners" 父組件&#xff1a; <template><div id"app"><myCo…

MyBatis的XML映射文件

Mybatis的開發有兩種方式&#xff1a; 注解 XML配置文件 通過XML配置文件的形式來配置SQL語句&#xff0c;這份兒XML配置文件在MyBatis當中也稱為XML映射文件。 導學&#xff1a;在MyBatis當中如何來定義一份兒XML映射文件&#xff1f; 在MyBatis當中&#xff0c;定義XML…

使用 HTML、CSS 和 JavaScript 創建多步驟表單

使用 HTML、CSS 和 JavaScript 創建多步驟表單 為了處理又長又復雜的表單&#xff0c;我們需要將它們分成多個步驟。通過一次只在屏幕上顯示一些輸入&#xff0c;表單會感覺更容易理解&#xff0c;并防止用戶感到被大量的表單字段淹沒。 在本文中&#xff0c;我將逐步指導如何…

有哪些可能引起前端安全的問題?

跨站腳本 (Cross-Site Scripting, XSS) ?種代碼注??式,為了與 CSS 區分所以被稱作 XSS。早期常?于?絡論壇, 起因是?站沒有對?戶的輸?進?嚴格的限制, 使得攻擊者可以將腳本上傳到帖?讓其他?瀏覽到有惡意腳本的??, 其注??式很簡單包括但不限于 JavaScript / CSS …

基礎堆排序(Java 實例代碼)

目錄 基礎堆排序 一、概念及其介紹 二、適用說明 三、過程圖示 四、Java 實例代碼 src/runoob/heap/Heapify.java 文件代碼&#xff1a; 基礎堆排序 一、概念及其介紹 堆排序&#xff08;Heapsort&#xff09;是指利用堆這種數據結構所設計的一種排序算法。 堆是一個近…

Linux_5_Shell腳本編程

目錄 1 基礎1.1 程序組成1.2 程序編程風格1.3 編程語言1.4 編程邏輯處理方式 2 shell 腳本語言的基本結構2.1 shell腳本的用途2.2 shell腳本基本結構2.3 創建shell腳本過程2.4 腳本注釋規范2.5 第一個腳本2.6 腳本調試2.7 變量2.7.1 變量2.7.2 變量類型2.7.3 編程語言分類2.7.4…

【MAC】 M2 brew安裝 docker 運行失敗 解決

MAC 安裝 brew install --cask docker 之后一直顯示docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?. 網上看了一些文章 發現 這個不適用于M2 所以要從官網上下載 docker 安裝成功

C++ 動態規劃經典案例解析之最長公共子序列(LCS)_窺探遞歸和動態規劃的一致性

1. 前言 動態規劃處理字符相關案例中&#xff0c;求最長公共子序列以及求最短編輯距離&#xff0c;算是經典中的經典案例。 講解此類問題的算法在網上一抓應用一大把&#xff0c;即便如此&#xff0c;還是忍不住有寫此文的想法。畢竟理解、看懂都不算是真正掌握&#xff0c;唯…

多線程與并發編程面試題總結

多線程與并發編程 多線程 線程和進程的區別&#xff1f; 從操作系統層面上來講&#xff1a;進程(process)在計算機里有單獨的地址空間&#xff0c;而線程只有單獨的堆棧和局部內存空間&#xff0c;線程之間是共享地址空間的&#xff0c;正是由于這個特性&#xff0c;對于同…

Vim入門教程vimtutor1.7總結

vimtutor命令可以打開教程文檔 原文特別提示 ??? 特別提示&#xff1a;切記您要在使用中學習&#xff0c;而不是在記憶中學習 Vim模式 正常模式&#xff08;Normal Mode&#xff09;&#xff1a;默認模式&#xff0c;可以使用基礎命令進行操作命令模式&#xff08;Command…

阿里云國際版云服務器防火墻怎么設置呢?

入侵防御頁面為您實時展示云防火墻攔截流量的源IP、目的IP、阻斷應用、阻斷來源和阻斷事件詳情等信息。本文介紹了入侵防御頁面展示的信息和相關操作&#xff0c;下面和012一起來了解阿里云國際版云服務器防火墻設置&#xff1a; 前提條件 您需要先在防護配置頁面&#xff0c;開…