【代碼隨想錄算法訓練營Day34】860.檸檬水找零;406.根據身高重建隊列;452.用最少數量的箭引爆氣球

??Day 34 第八章 貪心算法 part04

??今日任務

  • 860.檸檬水找零
  • 406.根據身高重建隊列
  • 452.用最少數量的箭引爆氣球

??860.檸檬水找零

  • 本題看上好像挺難,其實挺簡單的,大家先嘗試自己做一做。
  • 題目鏈接:https://leetcode.cn/problems/lemonade-change/
  • 視頻講解:https://www.bilibili.com/video/BV12x4y1j7DD
  • 文章鏈接:https://programmercarl.com/0860.%E6%9F%A0%E6%AA%AC%E6%B0%B4%E6%89%BE%E9%9B%B6.html

自己的思路

利用switch case語句判斷

自己的代碼(?通過100%)

踩坑:

  • switch的case需要用break不然會一直執行剩下的case
public boolean lemonadeChange(int[] bills) {int count5 = 0;int count10 = 0;for (int i = 0; i < bills.length; i++) {switch (bills[i]){case 5:count5 ++;break;case 10:count10 ++;if(count5 > 0) count5--;else return false;break;case 20:if(count10 > 0 && count5 > 0){count10 --;count5 --;}else if(count5 >= 3){count5 -= 3;}else{return false;}break;}}return true;
}

隨想錄思路

和我的基本一樣只是換成if-else

隨想錄代碼

public boolean lemonadeChange(int[] bills) {int five = 0;int ten = 0;for (int i = 0; i < bills.length; i++) {if (bills[i] == 5) {five++;} else if (bills[i] == 10) {five--;ten++;} else if (bills[i] == 20) {if (ten > 0) {ten--;five--;} else {five -= 3;}}if (five < 0 || ten < 0) return false;}return true;
}

??406.根據身高重建隊列

  • 本題有點難度,和分發糖果類似,不要兩頭兼顧,處理好一邊再處理另一邊。
  • 題目鏈接:https://leetcode.cn/problems/queue-reconstruction-by-height/
  • 視頻講解:https://www.bilibili.com/video/BV1EA411675Y
  • 文章鏈接:https://programmercarl.com/0406.%E6%A0%B9%E6%8D%AE%E8%BA%AB%E9%AB%98%E9%87%8D%E5%BB%BA%E9%98%9F%E5%88%97.html

自己的思路

先以ki排序然后再通過hi插入
難點:不會對二維數組進行排序

隨想錄思路

思路一樣

  1. 按照k為下標重新插入隊列就可以了,以圖中{5,2} 為例:
    [圖片]

  2. 在按照身高從大到小排序后:

  • 局部最優:優先按身高高的people的k來插入。插入操作過后的people滿足隊列屬性
  • 全局最優:最后都做完插入操作,整個隊列滿足題目隊列屬性
  1. 整個插入過程如下:
    排序完的people: [[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]]
    插入的過程:
  • 插入[7,0]:[[7,0]]
  • 插入[7,1]:[[7,0],[7,1]]
  • 插入[6,1]:[[7,0],[6,1],[7,1]]
  • 插入[5,0]:[[5,0],[7,0],[6,1],[7,1]]
  • 插入[5,2]:[[5,0],[7,0],[5,2],[6,1],[7,1]]
  • 插入[4,4]:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]

此時就按照題目的要求完成了重新排列。

隨想錄代碼

class Solution {public int[][] reconstructQueue(int[][] people) {// 身高從大到小排(身高相同k小的站前面)Arrays.sort(people, (a, b) -> {if (a[0] == b[0]) return a[1] - b[1];   // a - b 是升序排列,故在a[0] == b[0]的狀況下,會根據k值升序排列return b[0] - a[0];   //b - a 是降序排列,在a[0] != b[0],的狀況會根據h值降序排列});LinkedList<int[]> que = new LinkedList<>();for (int[] p : people) {que.add(p[1],p);   //Linkedlist.add(index, value),會將value插入到指定index里。}return que.toArray(new int[people.length][]);}
}

二維數組排序

  • 四個方法
    1. sort(T[] a):對指定數組進行升序排列。
    2. sort(T[] a, int fromIndex, int toIndex):對指定數組的指定范圍升序排列。
    3. sort(T[] a, Comparator<? supre T> c): 根據指定比較器產生的順序對指定對象數組進行排序。
    4. sort(T[] a, int fromIndex, int toIndex, Comparator<? supre T> c): 根據指定比較器產生的順序對指定對象數組的指定范圍進行排序。
  • 二維數組按照第一維數組排序
int[][] nums=new int[][]{{1,3},{1,2},{5,1},{4,5},{3,3}};
//方法一,使用比較器
Arrays.sort(nums,new Comparator<int[]>(){@Overridepublic int compare(int[] a,int[] b){// 當第一維相等時比較第二維的if(a[0] == b[0]){return a[1]-b[1];}else{return a[0]-b[0];}}
});// 方法二,使用 lambda 表達式
Arrays.sort(nums,(a,b) -> a[0] == b[0] ? a[1]-b[1] : a[0]-b[0]);
for (int[] num : nums) {System.out.print(Arrays.toString(num));
}
// 結果 : [1, 2][1, 3][3, 3][4, 5][5, 1] 
  • 二維數組按照第二維數組排序
int[][] nums=new int[][]{{1,3},{1,2},{5,1},{4,5},{3,3}};
//方法一
Arrays.sort(nums,new Comparator<int[]>(){@Overridepublic int compare(int[] a,int[] b){// 當第二維相等時比較第一維的if(a[1] == b[1]){return a[0]-b[0];}else{return a[1]-b[1];}}
});// 方法二,使用 lambda 表達式
Arrays.sort(nums,(a,b) -> a[1] == b[1]  ? a[0]-b[0] : a[1]-b[1]);
for (int[] num : nums) {System.out.print(Arrays.toString(num));
}
// 結果 : [5, 1][1, 2][1, 3][3, 3][4, 5]

??452. 用最少數量的箭引爆氣球

  • 本題是一道 重疊區間的題目,好好做一做,因為明天三道題目,都是 重疊區間。
  • 題目鏈接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/
  • 視頻講解:https://www.bilibili.com/video/BV1SA41167xe
  • 文章鏈接:https://programmercarl.com/0452.%E7%94%A8%E6%9C%80%E5%B0%91%E6%95%B0%E9%87%8F%E7%9A%84%E7%AE%AD%E5%BC%95%E7%88%86%E6%B0%94%E7%90%83.html

自己的思路

就是一個取交集的問題

  1. 先對二維數組進行排序(根據第一個數字)
  2. 然后選定第一個范圍的右區間A,看后面有幾個(n)范圍的左區間小于等于A,即可以一下扎破n+1個氣球
  3. 然后再從第n+2個范圍開始判斷

自己的代碼(?通過84.56%)

踩坑:
用lambda表達式會溢出,排不了序,必須使用比較器

public static int findMinArrowShots(int[][] points) {if(points.length == 1) return 1;int count = 1;Arrays.sort(points, new Comparator<int[]>() {@Overridepublic int compare(int[] points1, int[] points2) {//要升序排序,本來習慣寫類似于 return o1.val - o2.val 來實現,這里由于樣例中有出現//[[-2147483646,-2147483645],[2147483646,2147483647]] 這樣的例子,加減法會溢出,所以只能通過比較來實現if (points1[1] > points2[1]) {return 1;} else if (points1[1] < points2[1]) {return -1;}return 0;}});for(int[] i : points) System.out.println(Arrays.toString(i));int end = 0; //被取右區間的范圍下標int start = 1; //被取左區間的下標while(start < points.length){System.out.println("次數:"+count);//重疊if(points[start][0] <= points[end][1]){System.out.println("氣球{"+points[start][0]+", "+points[start][1]+"}可同時和氣球{"+points[end][0]+", "+points[end][1]+"}一起被扎破");}else{end = start;count ++;}start ++;}return count;
}

隨想錄思路

為了讓氣球盡可能的重疊,需要對數組進行排序。
如果氣球重疊了,重疊氣球中右邊邊界的最小值 之前的區間一定需要一個弓箭。
[圖片]

隨想錄代碼

/*** 時間復雜度 : O(NlogN)  排序需要 O(NlogN) 的復雜度* 空間復雜度 : O(logN) java所使用的內置函數用的是快速排序需要 logN 的空間*/
class Solution {public int findMinArrowShots(int[][] points) {// 根據氣球直徑的開始坐標從小到大排序// 使用Integer內置比較方法,不會溢出Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));int count = 1;  // points 不為空至少需要一支箭for (int i = 1; i < points.length; i++) {if (points[i][0] > points[i - 1][1]) {  // 氣球i和氣球i-1不挨著,注意這里不是>=count++; // 需要一支箭} else {  // 氣球i和氣球i-1挨著points[i][1] = Math.min(points[i][1], points[i - 1][1]); // 更新重疊氣球最小右邊界}}return count;}
}

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

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

相關文章

【計算機網絡】IO多路轉接之poll

文章目錄 一、poll函數接口二、socket就緒條件三、poll的優點四、poll的缺點五、poll使用案例--只讀取數據的server服務器1.err.hpp2.log.hpp3.sock.hpp4.pollServer.hpp5.main.cc 一、poll函數接口 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int t…

2024.3.3 訓練記錄(7)

這幾天又忘記每天復習了&#xff0c;以后在實驗室復習完再回去好了 最近做1800的題目好多dp啊太ex了 文章目錄 牛客 練習賽122D 圓CF 1396B Stoned GameCF 1355C Count TrianglesCF 1437C Chef MonocarpCF 271D Good SubstringsCF 1475D Cleaning the PhoneCF 1362D2 Prefix-…

“羊駝“入侵CV,美團浙大沈春華團隊將LLaMA向CV擴展,構建全新基礎模型VisionLLaMA

本文首發:AIWalker https://arxiv.org/abs/2403.00522 https://github.com/Meituan-AutoML/VisionLLaMA 本文概述 大型語言模型構建在基于Transformer的架構之上來處理文本輸入, LLaMA 系列模型在眾多開源實現中脫穎而出。類似LLaMa的Transformer可以用來處理2D圖像嗎&#xf…

Python繪制不同形狀詞云圖

目錄 1.基本詞云圖1.1 導入所需庫1.2 準備詞匯1.3 配置參數并生成詞云圖1.4 在Python窗口中顯示圖片1.5 效果展示1.6 完整代碼 2. 不同形狀詞云圖2.1 找到自己所需形狀圖片2.2 利用PS將圖片設置為黑白色2.3 在代碼中設置背景2.4 效果展示 1.基本詞云圖 1.1 導入所需庫 import…

遠程調用--webClient

遠程調用webClient 前言1、創建webClient2、準備數據3、執行請求4、接收返回響應到的數據整體代碼 前言 非阻塞、響應式HTTP客戶端 1、創建webClient WebClient client WebClient.create();2、準備數據 Map<String,String> params new HashMap<>();params.pu…

貪心算法(區間問題)

452. 用最少數量的箭引爆氣球 題目(求無重復區間) 有一些球形氣球貼在一堵用 XY 平面表示的墻面上。墻面上的氣球記錄在整數數組 points &#xff0c;其中points[i] [xstart, xend] 表示水平直徑在 xstart 和 xend之間的氣球。你不知道氣球的確切 y 坐標。 一支弓箭可以沿著…

利用Python爬取8684公交路線查詢網站中全國公交站點信息

利用python語言結合requests、BeautifulSoup等類庫爬取https://api.8684.cn/v3/api.php?docitys&actprovince對應接口中所有城市公交路線信息以及公交站點信息。 import time import requests import json, re from bs4 import BeautifulSoup# 定義一個函數&#xff0c;傳…

“祖傳代碼“的是是非非

程序員眼中的“祖傳代碼”&#xff0c;就像一本古老而神秘的魔法書&#xff0c;藏著無窮的智慧和技巧&#xff0c;有些代碼像家傳寶貝&#xff0c;有些像祖傳秘方。快來分享一下你遇到的“祖傳代碼”吧~ 祖傳代碼的歷史與文化價值 祖傳代碼通常指的是經過長時間使用和傳承的代…

【DUSt3R】2張圖2秒鐘3D重建

【DUSt3R】2張圖2秒鐘3D重建 1. DUSt3R是一種用于稠密和無約束立體三維重建的方法,其實現步驟如下:2. 實際運行效果3. 運行結果4. 自問自答4.1 為社么這里要是使用transform模型呢?4.2 CroCo(通過跨視圖完成3D視覺任務的自我監督預訓練的一個研究)在DUSt3R的作用是什么,為…

打家劫舍(java版)

&#x1f4d1;前言 本文主要是【動態規劃】——打家劫舍(java版)的文章&#xff0c;如果有什么需要改進的地方還請大佬指出?? &#x1f3ac;作者簡介&#xff1a;大家好&#xff0c;我是聽風與他&#x1f947; ??博客首頁&#xff1a;CSDN主頁聽風與他 &#x1f304;每日一…

17 easy 290. 單詞規律

//給定一種規律 pattern 和一個字符串 s &#xff0c;判斷 s 是否遵循相同的規律。 // // 這里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每個字母和字符串 s 中的每個非空單詞之間存在著雙向連接的對應規律。 // // // // 示例1: // // //輸入: patte…

24計算機考研調劑 | 西安工大

西安工大 考研調劑招生信息 學校:西安工大 專業:- 年級:2024 招生人數:4 招生狀態:正在招生中 聯系方式:********* (為保護個人隱私,聯系方式僅限APP查看) 補充內容 歡迎化工、材料、環工等專業[或有計算機相關專業&#xff08;智能科學和軟件工程方向&#xff09;、機…

一款不錯的多端SSH工具:Xterminal

1、不僅是強大的SSH工具&#xff0c;更提供本地控制臺&#xff0c;以及更多即將推出的開發相關功能&#xff0c;讓您專注于創造卓越的代碼 2、AI賦能&#xff0c;智能命令提示&#xff0c;為大腦解壓 AI解答&#xff0c;讓你的疑問得到即時解答 AI智能提示&#xff0c;讓每一…

CodeFlying 和 aixcoder兩大免費軟開平臺,孰強孰弱?

今天為大家帶來碼上飛CodeFlying和aixcoder兩款免費的軟件開發平臺效果的測評 一、產品介紹 首先簡單介紹一下這兩個平臺 碼上飛CodeFlying&#xff1a;碼上飛 CodeFlying | AI 智能軟件開發平臺&#xff01; 是一款革命性的軟件開發平臺&#xff0c;它通過將軟件工程和大模…

Redis是AP的還是CP的?

redis是一個開源的內存數據庫&#xff0c;那么他到底是AP的還是CP的呢&#xff1f; 有人說&#xff1a;單機的是redis是cp的&#xff0c;而集群的redis是ap的&#xff1f; 但是我不這么認為&#xff0c;我覺得redis就是ap的&#xff0c;雖然在單機redis中&#xff0c;因為只有…

Git 基本操作 ?作區、暫存區、版本庫

創建本地倉庫&#xff1a; 創建 Git 本地倉庫 要提前說的是&#xff0c;倉庫是進行版本控制的?個文件目錄。我們要想對文件進行版本控制&#xff0c;就必須先創建?個倉庫出來。 首先touch 一個文件&#xff1a; 初始化倉庫&#xff1a; 創建完成后&#xff0c;我們會發現當前…

行列式錯題本

《1800》 1 階數和轉置 A是三階,B是4階,還有2這個系數 2 怎么啥也不會呀,委屈 行列式的拆分+提取系數 3

uniapp 安裝安卓、IOS模擬器并調試

一、安裝Android模擬器并調試 1.下載并安裝Android Studio。 2.創建簡單project。 3.安裝模擬器。 完成安卓模擬器的安裝。 4.啟動模擬器。 5.hbuilderx選擇模擬器、運行。 點擊刷新按鈕后出現模擬器&#xff0c;勾選并運行。 6.調試。 在 HBuilderX 中&#xff0c;項目啟…

每天一道leetcode:20.有效的括號(簡單;棧的經典題目)

?今日份題目 給定一個只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判斷字符串是否有效。 有效字符串需滿足&#xff1a; 左括號必須用相同類型的右括號閉合。 左括號必須以正確的順序閉合。 每個右括號都有一個對…

Nano 33 BLE Sense Rev2學習第一節——環境配置

參考文檔見Access Barometric Pressure Sensor Data on Nano 33 BLE Sense | Arduino Documentation 打開Arduino ide安裝開發板 選擇開發板 連接開發板到電腦&#xff0c;自動識別開發板端口&#xff0c;選擇端口