Re: [閒聊] 每日LeetCode

看板Marginalman作者 (みけねこ的鼻屎)時間2年前 (2023/01/05 13:50), 2年前編輯推噓2(201)
留言3則, 1人參與, 2年前最新討論串180/719 (看更多)
※ 引述《fxfxxxfxx (愛麗絲)》之銘言: : 452. Minimum Number of Arrows to Burst Balloons 給你一個二維陣列points,points[i]={x1, x2}表示第i個氣球的水平座標,我們將 氣球依照水平座標重疊,假設我們開一槍可以貫穿一整排的氣球,求出我們最少要開 幾槍才可以把氣球都打爛。 Example: Input: points = [[10,16],[2,8],[1,6],[7,12]] Output: 2 Explanation: 氣球按照下列方式排成一列 [10 11 12 13 14 15 16] [2 3 4 5 6 7 8] [1 2 3 4 5 6] [7 8 9 10 11 12] 我們第一次射擊射6位置可以打破points[1]和points[2] 第二次射擊可以打破points[0]和points[3],最少共需要兩次射擊,所以返回2。 Input: points = [[1,2],[3,4],[5,6],[7,8]] Output: 4 Explanation: 氣球按照下列方式排成一列 [1 2] [3 4] [5 6] [7 8] 每個氣球不重疊,共需要四次射擊 思路: 1.一開始是想把points排序之後的每個區間合併然後算有多少個不交替的區間, 但是像是[1 2] [2 3] [3 4] 雖然可以合併但是其實需要射兩次,所以換個方 向思考。 2.我們把氣球的最右邊想像成「最晚必須要射擊的地方」,然後按照最右邊座標 排序,以 [[10,16],[2,8],[1,6],[7,12]] 來說,排序完之後長這樣: [1 2 3 4 5 6] [2 3 4 5 6 7 8] [7 8 9 10 11 12] [10 11 12 13 14 15 16] 3.我們從左到右一路射過去,每次都射擊當前氣球的最右邊,排序完之後可以明顯觀察到 你射最右邊的同時會射到其他氣球的左邊部分,遇到小於的就表示重疊了該個氣球可跳 過,而當左邊的座標小於下一個氣球的右邊座標的時候,表示後面沒有氣球了,下一次 的射擊位置將改為下個氣球的最右邊,重複動作直到氣球射完為止。 Java Code: ------------------------------------------ class Solution { public int findMinArrowShots(int[][] points) { Arrays.sort(points, Comparator.comparingInt(a -> a[1])); int count = 1; int end = points[0][1]; for (int[] point : points) { if (point[0] > end) { count++; end = point[1]; } } return count; } } ------------------------------------------ -- https://i.imgur.com/PIoxddO.jpg
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.160.71.48 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1672897850.A.117.html ※ 編輯: Rushia (1.160.71.48 臺灣), 01/05/2023 13:54:53

01/05 23:52, 2年前 , 1F
大師 這題我完全沒想法
01/05 23:52, 1F

01/06 00:09, 2年前 , 2F
我試著用左邊的座標排然後一樣射右邊會 WA,知道問題在哪
01/06 00:09, 2F

01/06 00:09, 2年前 , 3F
可是不懂為什麼
01/06 00:09, 3F
文章代碼(AID): #1ZjcKw4N (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1ZjcKw4N (Marginalman)