力扣128. 最長連續序列 || 452. 用最少數量的箭引爆氣球

最長連續列

給定一個未排序的整數數組 nums ,找出數字連續的最長序列(不要求序列元素在原數組中連續)的長度。

請你設計并實現時間復雜度為 O(n) 的算法解決此問題。

輸入:nums = [100,4,200,1,3,2]
輸出:4
解釋:最長數字連續序列是 [1, 2, 3, 4]。它的長度為 4
輸入:nums = [0,3,7,2,5,8,4,6,0,1]
輸出:9
輸入:nums = [1,0,1,2]
輸出:3

首先這道題,第一眼看到就覺得應該使用Set來解決。為什么呢?首先第一個需要使用set來去重,第二個set可以根據從contains來查找元素。

OK,那我們就先把元素存到set里

Set<Integer> set = new HashSet<>();
for(Integer num : nums){set.add(num);
}

之后呢?題目說復雜度O(n),所以呢排序不行,那只能另辟蹊徑了。

題目要求找出最大的連續長度,那么我們是不是要想辦法找到他的起點。但是呢又有一個問題,如果不同元素直接差值很大呢,比如400 301 302 -500。這樣不管是說我們先找到最小元素然后去逐步+1,還是第一個元素來計算都很耗時。

那怎么辦呢?我們可以采用直接計算的方法。

起點 x 必然滿足 x-1 不在集合中,所以遍歷集合中的每個元素 x,僅當 x 是起點時(!set.contains(x-1)),才嘗試擴展序列。

這個起點是一個臨時起點,并不是說他一定是整個集合的起點。比如400 300 301。400-1必然是找不到,但不能說400是整體的起點

從起點 x 開始,依次檢查 x+1, x+2, … 是否存在于集合,直到無法繼續。序列長度就為y - x。保存每次查找的結果,最后使用最長的鏈路

for(x : set){//如果還能找到更小的,那就先不使用,去set里找下一個元素if(set.contains(x-1){continue;}//如果當前這個數x,找不到x-1的了,那就先用x來查int y = x + 1;//如果有x+1的數,那就用y記錄下來while(set.contains(y)){y++;}//一次次的循環, 直到找到最大的y-xans = Math.max(ans,y-x);
}

題解:

class Solution {public int longestConsecutive(int[] nums) {Set<Integer> set = new HashSet<>();for(Integer num : nums){set.add(num);}int ans = 0;//假設set里是5 4 3 2 1 0for(Integer x : set){//如果還能找到更小的,那就直接退出if(set.contains(x - 1)){continue;}//如果當前這個數x,找不到x-1的了,那就先用x來查int y = x + 1;//如果有x+1的數,那就用y記錄下來while(set.contains(y)){y++;}//一次次的循環, 知道找到最大的y-xans = Math.max(ans,y-x);}return ans;}
}

用最少數量的箭引爆氣球

有一些球形氣球貼在一堵用 XY 平面表示的墻面上。墻面上的氣球記錄在整數數組 points ,其中points[i] = [xstart, xend] 表示水平直徑在 xstart 和 xend之間的氣球。你不知道氣球的確切 y 坐標。

一支弓箭可以沿著 x 軸從不同點 完全垂直 地射出。在坐標 x 處射出一支箭,若有一個氣球的直徑的開始和結束坐標為 xstart,xend, 且滿足 xstart ≤ x ≤ xend,則該氣球會被 引爆 。可以射出的弓箭的數量 沒有限制 。 弓箭一旦被射出之后,可以無限地前進。

給你一個數組 points ,返回引爆所有氣球所必須射出的 最小 弓箭數 。

?輸入:points = [[10,16],[2,8],[1,6],[7,12]]
輸出:2
解釋:氣球可以用2支箭來爆破:
-在x = 6處射出箭,擊破氣球[2,8][1,6]-在x = 11處發射箭,擊破氣球[10,16][7,12]
?輸入:points = [[1,2],[3,4],[5,6],[7,8]]
輸出:4
解釋:每個氣球需要射出一支箭,總共需要4支箭。
輸入:points = [[1,2],[2,3],[3,4],[4,5]]
輸出:2
解釋:氣球可以用2支箭來爆破:
- 在x = 2處發射箭,擊破氣球[1,2][2,3]- 在x = 4處射出箭,擊破氣球[3,4][4,5]

首先看到這題,我最初想的是不斷計算兩個節點之間是否覆蓋,太過于復雜

后來看到題解后才想到可以用排序的方法來計算是否覆蓋

按右端點進行排序后,每次在右端點處射箭,就可以覆蓋掉所有左端點<=當前右端點的氣球。射在右端點能最大化的覆蓋重疊的氣球。

若當前氣球的左端>上支箭矢的位置(上一個范圍的右端點),表明需要新加一支箭,并更新當前箭的位置為當前氣球的右端點。
否則則表明,當前氣球被覆蓋,無需處理

首先我們對所有的坐標進行排序(以end坐標為值計算)

Arrays.sort(points,(a,b) -> Integer.compare(a[1],b[1]));

接下來只需要判斷,下一個坐標的左側,是否大于我們這個坐標的右側即可判斷出是否覆蓋。如果不覆蓋則箭數+1

?int end = points[0][1];  //先定義出初始的end坐標,排序后的第一個元素的右側。for(int i = 1; i < points.length; i++){if(points[i][0] > end){  //當前元素的左側,大于end的右側arrows++;end = points[i][1]; }//注意,如果當前元素在我們end的范圍內,end也不需要更新。因為如果更新,那么我們第一個節點就會無法覆蓋到。
}

解:

class Solution {public int findMinArrowShots(int[][] points) {Arrays.sort(points,(a,b) -> Integer.compare(a[1],b[1]));int arrows = 1;int end = points[0][1];for(int i = 1; i < points.length; i++){if(points[i][0] > end){arrows++;end = points[i][1]; }}return arrows;}
}

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

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

相關文章

Python教學:lambda表達式的應用-由DeepSeek產生

Python 中的 ?lambda 表達式?是一種簡潔的匿名函數&#xff0c;適合快速定義簡單邏輯的函數。它常用于需要函數作為參數的場景&#xff0c;如高階函數、排序、過濾等。以下是 lambda 的典型應用場景及示例&#xff1a; 1. ?基本語法? lambda 參數1, 參數2, ... : 表達式 特…

3D標定中的平面約束-平面方程的幾何意義

平面方程的一般形式為 AxByCzD0&#xff0c;其中系數 A、B、C、D共同決定了平面的幾何特性。 系數對平面姿態的影響 1. 法向量方向2. 平面位置3. 比例關系4. 姿態變換5.平面空間變換 1. 法向量方向 法向量方向由 A、B、C 決定 核心作用&#xff1a;系數 A、B、C 構成的向量 (…

C/C++藍橋杯算法真題打卡(Day6)

一、P8615 [藍橋杯 2014 國 C] 拼接平方數 - 洛谷 方法一&#xff1a;算法代碼&#xff08;字符串分割法&#xff09; #include<bits/stdc.h> // 包含標準庫中的所有頭文件&#xff0c;方便編程 using namespace std; // 使用標準命名空間&#xff0c;避免每次調用…

如何在 GoLand 中設置默認項目文件夾

在使用 GoLand 進行開發時&#xff0c;設置一個默認的項目文件夾可以大大提高工作效率。默認項目文件夾會在你打開或新建項目時自動預選&#xff0c;避免每次都需要手動導航到目標目錄。本文將詳細介紹如何在 GoLand 中設置默認項目文件夾。 步驟一&#xff1a;打開系統設置 …

DeepSeek私有化部署與安裝瀏覽器插件內網穿透遠程訪問實戰

文章目錄 前言1. 本地部署OllamaDeepSeek2. Page Assist瀏覽器插件安裝與配置3. 簡單使用演示4. 遠程調用大模型5. 安裝內網穿透6. 配置固定公網地址 前言 最近&#xff0c;國產AI大模型Deepseek成了網紅爆款&#xff0c;大家紛紛想體驗它的魅力。但隨著熱度的攀升&#xff0c…

Docker運行postgreSQL,由于異常啟動或者退出后,提示could not locate a valid checkpoint record

pg_resetwal 是 PostgreSQL 的“急救工具”&#xff0c;用于在極端情況下修復因 WAL 或控制文件損壞導致的啟動問題。 但需注意&#xff1a; 風險極高&#xff0c;可能導致數據不一致。必須立即轉儲并恢復&#xff0c;避免直接在修復后的數據庫中執行寫操作。僅在備份后使用&…

pytorch小記(十):pytorch中torch.tril 和 torch.triu 詳解

pytorch小記&#xff08;十&#xff09;&#xff1a;pytorch中torch.tril 和 torch.triu 詳解 PyTorch torch.tril 和 torch.triu 詳解1. torch.tril&#xff08;計算下三角矩陣&#xff09;&#x1f4cc; 作用&#x1f50d; 語法&#x1f539; 參數&#x1f4cc; 示例&#x1…

Java基礎與集合

參考 Java基礎知識詳解&#xff1a;從面向對象到異常處理-CSDN博客 2024年 Java 面試八股文&#xff08;20w字&#xff09;_java面試八股文-CSDN博客 基礎知識 java概述 什么是java&#xff1f; java是一種面向對象的編程語言 java特點 面向對象&#xff08;繼承&#…

【R語言】二項分布,正態分布,極大似然估計實現

二項分布 生成二項分布概率 s <- 0:60 prob <- dbinom(s, size 60, prob 1/6)s <- 0:60&#xff1a;生成 0 到 60 之間的整數&#xff0c;表示可能的成功次數。 dbinom(s, size 60, prob 1/6)dbinom(x, size, prob) 計算二項分布的概率質量函數&#xff08;PMF…

【C語言】:學生管理系統(多文件版)

一、文件框架 二、Data data.txt 三、Inc 1. list.h 學生結構體 #ifndef __LIST_H__ #define __LIST_H__#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <time.h>#define MAX_LEN 20// 學生信息…

OpenResty/Lua 編碼指南/指南

很多開發語言都有自己的編碼規范&#xff0c;來告訴開發者這個領域內一些約定俗成的東西&#xff0c;讓大家寫的代碼風格保持一致&#xff0c;并且避免一些常見的陷阱。這對于新手來說是非常友好的&#xff0c;可以讓初學者快速準確地上手。比如 Python 的 PEP 80&#xff0c;就…

數據結構 -- 二叉樹的存儲結構

二叉樹的存儲結構 順序存儲 #define MaxSize 100 struct TreeNode{ElemType value; //結點中的數據元素bool isEmpty; //結點元素是否為空 };//定義一個長度為MaxSize的數組t&#xff0c;按照從上至下、從左至右的順序依次完成存儲完全二叉樹中的各個節點 TreeNode t[MaxSi…

Linux系統移植篇(十一)Linux 內核啟動流程

要分析 Linux 啟動流程&#xff0c;同樣需要先編譯一下 Linux 源碼&#xff0c;因為有很多文件是需要編譯才 會生成的。首先分析 Linux 內核的連接腳本文件 arch/arm/kernel/vmlinux.lds&#xff0c;通過鏈接腳本可以 找到 Linux 內核的第一行程序是從哪里執行的。vmlinux.lds …

【Docker入門】構建推送第一個Docker映像

【Docker入門】構建推送第一個Docker映像 Build and Push the First Docker Image By JacksonML Docker的容器(Container)映像是輕量級的可執行獨立包&#xff0c;包含代碼、運行時、庫、環境變量以及配置文件&#xff0c;它對于運行軟件至關重要。注冊表可在團隊間分享映像。…

【eNSP實戰】(續)一個AC多個VAP的實現—將隧道轉發改成直接轉發

在 一個AC多個VAP的實現—CAPWAP隧道轉發 此篇文章配置的基礎上&#xff0c;將隧道轉發改成直接轉發 一、改成直接轉發需要改動的配置 &#xff08;一&#xff09;將連接AP的接口改成trunk口&#xff0c;并允許vlan100、101、102通過 [AC1]interface GigabitEthernet 0/0/8 …

SPI 總線協議

1、協議介紹 SPI&#xff0c;是英語 Serial Peripheral interface 的縮寫&#xff0c;顧名思義就是串行外圍設備接口。是 Motorola 首先在其 MC68HCXX 系列處理器上定義的。 SPI&#xff0c;是一種高速的&#xff0c;全雙工&#xff0c;同步的通信總線。主節點或子節點的數據在…

我愛學算法之——滑動窗口攻克子數組和子串難題(上)

現在來學習"滑動窗口"這一算法思想。 至于什么是"滑動窗口"呢&#xff1f;簡單來說就是同向雙指針&#xff1b;現在來通過題目來了解什么是"滑動窗口" 一、長度最小的子數組 題目鏈接&#xff1a;長度最小的子數組 題目解析 先來看題目&#…

ora-600 ktugct: corruption detected---惜分飛

接手一個oracle 21c的庫恢復請求,通過Oracle數據庫異常恢復檢查腳本(Oracle Database Recovery Check)腳本檢測之后,發現undo文件offline之后,做了resetlogs操作,導致該文件目前處于WRONG RESETLOGS狀態 嘗試恢復數據庫ORA-16433錯誤 SQL> recover datafile 1; ORA-00283:…

20. Excel 自動化:Excel 對象模型

一 Excel 對象模型是什么 Excel對象模型是Excel圖形用戶界面的層次結構表示&#xff0c;它允許開發者通過編程來操作Excel的各種組件&#xff0c;如工作簿、工作表、單元格等。 xlwings 是一個Python庫&#xff0c;它允許Python腳本與Excel進行交互。與一些其他Python庫&#x…

IIS 服務器日志和性能監控

Internet Information Services &#xff08;IIS&#xff09; 是 Microsoft 提供的一款功能強大、靈活且可擴展的 Web 服務器&#xff0c;用于托管網站、服務和應用程序。IIS 支持 HTTP、HTTPS、FTP、SMTP 和更多用于提供網頁的協議&#xff0c;因此廣泛用于企業環境。 IIS 的…