(leetcode算法題)287. 尋找重復數(經典題目,二分解法)

如果一個題目限定了數據范圍是[1, n]內的整數,那么這個題目可以思考的就是

nums[i]和 i 的關系,769. 最多能完成排序的塊?這個題就使用到了子數組中最大值和 連續[0, n - 1]的關系

而對于本題來說,也可以思考[1, n] 和 nums[i] 的關系,想要觀察他們之間的關系

以nums = [1,3,4,2,2]為例,可以畫出如下散點圖,下列散點圖,因為這個題要求不能更改原數組,而且只能使用o(1)的空間復雜度設計算法,所以直接畫出{1, 1},?{2, 3},?{3, 4},?{4, 2}, {5, 2} 這幾個點

這個圖 已經包含了所有nums中的信息,那么如何去解讀這張圖的信息來找到 2這個出現兩次的縱坐標呢?

????????一個很自然的想法就是畫一條水平線,讓這條水平線從上往平移,一旦平移到穿過兩個即以上的點,那么此時這條水平線的縱坐標就是要找的重復兩次的數,這樣的想法就是兩個for循環來實現的o(n2) 的算法,能夠滿足題目要求,但是這樣的算法不能通過全部測試用例

那么怎么解決這個問題?首先想一想有沒有o(nlogn)的解法?

logn的解法中二分就是很常見的算法,可是二分只能針對有序數組進行啊,1 3 4 2 2 算哪門子的有序數組?那不如換個思路,在上圖中畫出四條平行線,y1 = 1, y2 = 2, y3?= 3, y4 = 4,觀察后發現,

y1 穿過以及其下方的點有1個,y2 穿過以及其下方的點有3個,

y3 穿過以及其下方的點有4個,y4 穿過以及其下方的點有5個

正好是在 y2?處多穿過了兩個點,

此時可以根據以上事實發現如下規律:

要找的數是[1,n-1]中的某個target,這個target滿足下列性質

假設x是屬于[1,n-1]中的一個數,記在nums中小于等于x的有yx個

如果yx <= x,則x 一定不是要找到的target,且x < target

如果yx > x,則納入target備選集合中,且x >= target

而target就是備選集合中最小的那個數

那么就可以使用如下算法

class Solution {
public:int findDuplicate(vector<int>& nums) {int n = nums.size();int l = 1, r = n - 1;while(l < r){int mid = l + (r - l) / 2;int count = 0;for(int i = 0; i < n; ++i){if(nums[i] <= mid){count++;}}if(count <= mid){l = mid + 1;}else{r = mid;}}return l;}
};

其實現原理可以通過幾張圖演示

?

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

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

相關文章

獲得PostgreSQL中級認證后,可以從事哪些工作崗位?

獲得 PostgreSQL 中級認證后&#xff0c;可以獲得的崗位 數據庫管理類 數據庫管理員&#xff08;DBA&#xff09;&#xff1a;負責 PostgreSQL 數據庫的日常維護、監控、備份與恢復、性能優化、安全管理等工作。確保數據庫的穩定運行和數據的安全性、完整性&#xff0c;及時處理…

4.1、二纖單向、二纖雙向、四纖雙向,網絡級保護

1、線性復用段保護&#xff08;LMSP&#xff09; 就像是給網絡業務傳輸準備的一個 “保險”。在 SDH 和 MSTP 網絡里&#xff0c;業務信號要通過一段一段的路&#xff08;復用段&#xff09;來傳輸&#xff0c;LMSP 就是為了保證這些路出問題的時候&#xff0c;業務還能正常走。…

【spark源碼修改】hive3.1.3 spark3.5.4編譯,需要修改源碼,最終編譯成功

【spark源碼修改】hive3.1.3 spark3.5.4編譯,需要修改源碼,最終編譯成功 1. 準備安裝包與maven編譯環境1.1 安裝環境準備1.2 修改pom1.3 打包命令2. 編譯與問題解決2.1 開始編譯 失敗, 缺包pentaho-aggdesigner-algorithm:pom:5.1.5-jhyde2.2 Hive Spark Remote Client 模塊…

SQL-leetcode-584. 尋找用戶推薦人

584. 尋找用戶推薦人 表: Customer -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | | referee_id | int | -------------------- 在 SQL 中&#xff0c;id 是該表的主鍵列。 該表的每一行表示一個客戶的 id、姓名以及推…

【數據庫】一、數據庫系統概述

文章目錄 一、數據庫系統概述1 基本概念2 現實世界的信息化過程3 數據庫系統內部體系結構4 數據庫系統外部體系結構5 數據管理方式 一、數據庫系統概述 1 基本概念 數據&#xff1a;描述事物的符號記錄 數據庫&#xff08;DB&#xff09;&#xff1a;長期存儲在計算機內的、…

Scala語言的面向對象編程

Scala語言的面向對象編程 面向對象編程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一種編程范式&#xff0c;它使用“對象”來組織代碼&#xff0c;這些對象能夠包含數據&#xff08;屬性&#xff09;以及功能&#xff08;方法&#xff09;。Scala…

【JVM-2.1】如何使用JMC監控工具:詳細步驟與實戰指南

Java Mission Control&#xff08;JMC&#xff09;是Oracle提供的一個高級圖形化監控工具&#xff0c;專為Java應用程序的性能分析和故障排查設計。JMC不僅提供了實時監控功能&#xff0c;還支持飛行記錄器&#xff08;Flight Recorder&#xff09;功能&#xff0c;能夠記錄JVM…

QT c++ 樣式 設置 標簽(QLabel)的漸變色美化

上一篇文章中描述了按鈕的純色&#xff0c;本文描述標簽的漸變色美化。 1.頭文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> //#include "CustomButton.h"#include <QVBoxLayout> #include <QLinearGradient> #include <QLabel…

設計模式 行為型 觀察者模式(Observer Pattern)與 常見技術框架應用 解析

觀察者模式&#xff08;Observer Pattern&#xff09;是一種行為設計模式&#xff0c;它定義了一種一對多的依賴關系&#xff0c;讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時&#xff0c;會通知所有觀察者對象&#xff0c;使它們能夠自動更新。 一…

03_Redis基本操作

1.Redis查詢命令 1.1 官網命查詢命令 為了便于學習Redis,官方將其用于操作不同數據類型的命令進行了分類整理。你可以通過訪問Redis官方網站上的命令參考頁面https://redis.io/commands來查閱這些分組的命令,這有助于更系統地理解和使用Redis的各項功能。 1.2 HELP查詢命令…

system securiry: supervisor password required

報錯解釋&#xff1a; 這個錯誤表明系統安全模塊&#xff08;如SELinux或AppArmor&#xff09;需要超級用戶&#xff08;通常是root&#xff09;的密碼來確認一個操作。這通常發生在嘗試進行某些需要高級權限的系統更改時。 解決方法&#xff1a; 如果你擁有root權限&#xff0…

Ubuntu 如何查看盤是機械盤還是固態盤

在 Ubuntu 系統中&#xff0c;您可以通過以下方法來確定硬盤是機械硬盤&#xff08;HDD&#xff09;還是固態硬盤&#xff08;SSD&#xff09;&#xff1a; 使用 lsblk 命令&#xff1a; 打開終端&#xff0c;輸入以下命令&#xff1a; lsblk -d -o name,rota該命令將列出所…

探索式測試

探索式測試是一種軟件測試風格&#xff0c;它強調獨立測試人員的個人自由和職責&#xff0c;為了持續優化其工作的價值&#xff0c;將測試學習、測試設計、測試執行和測試結果分析作為相互支持的活動&#xff0c;在整個項目實現過程中并行地執行。 選擇合適的探索式測試方法我…

uniapp 微信小程序內嵌h5實時通信

描述&#xff1a; 小程序webview內嵌的h5需要向小程序實時發送消息&#xff0c;有人說postMessage可以實現&#xff0c;所以試驗一下&#xff0c;結果是實現不了實時&#xff0c;只能在特定時機后退、組件銷毀、分享時小程序才能接收到信息&#xff08;小程序為了安全等考慮做了…

php 使用simplexml_load_string轉換xml數據格式失敗

本文介紹如何使用php函數解析xml數據為數組。 <?php$a <xml><ToUserName><![CDATA[ww8b77afac71336111]]></ToUserName><FromUserName><![CDATA[sys]]></FromUserName><CreateTime>1736328669</CreateTime><Ms…

HOW - Form 表單 label 和 wrapper 對齊場景

一、背景 在日常使用 表單 時&#xff0c;我們一般有如下布局&#xff1a; 可以通過 Form 表單提供的配置直接設置&#xff1a; <Formform{form}labelCol{{ span: 4 }}wrapperCol{{ span: 20 }}onFinish{handleSubmit}><Form.Itemlabel"輸入框"name"…

深入探索AI核心模型:CNN、RNN、GAN與Transformer

在人工智能的飛速發展中&#xff0c;眾多深度學習模型和算法不斷涌現&#xff0c;推動了許多領域的進步。特別是在圖像識別、自然語言處理、生成建模等方向&#xff0c;AI模型的應用越來越廣泛。本文將介紹幾種最常用的AI模型&#xff0c;包括卷積神經網絡&#xff08;CNN&…

櫻桃鍵盤win鍵按了沒反應怎么處理

?游戲模式?&#xff1a;部分櫻桃鍵盤在進入游戲模式后會禁用Win鍵&#xff0c;以防止在游戲過程中誤觸。可以通過按下Fn F9鍵來切換游戲模式和辦公模式&#xff0c;確保鍵盤處于辦公模式下&#xff0c;Win鍵即可恢復正常功能。? &#xff08;至此我的問題已解決&#xff0c…

解析若依 `R.java` 類——ruoyi-common-core

文章目錄 1. 類的整體功能2. 代碼解析2.1 成員變量和常量2.2 靜態方法構造響應對象2.3 內部私有方法 restResult2.4 工具方法 3. 開發中的應用擴展3.1 接口規范化3.2 快速響應構造3.3 自定義狀態碼3.4 自定義擴展 R.java 是若依框架中通用的 API 響應封裝類&#xff0c;主要用于…

Perl語言的數據結構

Perl語言的數據結構 Perl是一種功能強大的、靈活的腳本語言&#xff0c;廣泛用于文本處理、系統管理、網絡編程以及許多其他領域。其靈活性不僅體現在語法上&#xff0c;還體現在其豐富的數據結構上。本文將深入探討Perl的主要數據結構&#xff0c;包括標量、數組、哈希以及引…