代碼隨想錄算法訓練營第36期DAY37

DAY37

先二刷昨天的3道題目,每種方法都寫:是否已完成:是。

報告:134加油站的樸素法沒寫對。原因是:在if中缺少了store>=0的判斷,只給出了index==i的判斷。前進法沒寫出來。因為忘記了總油量的判斷。Sum。注意變量的初始化。分配糖果注意if里面放的是ratings;

860檸檬水找零

網上摘得思路,看來我還是得冷靜下來多想多模擬,最好把文字思路寫下來,慢慢打磨:

思路:

  1. 遇10元要消耗5元數量,遇到20元可消耗10元和5元數量,由于要保證后面還可能需要5元
    2. 那么,遇到20元時就要優先消耗10元的數量

  1. class?Solution?{
  2. public:
  3. ????bool?lemonadeChange(vector<int>&?bills)?{
  4. ????????int?five=0,ten=0,twenty=0;
  5. ????????for(int?bill:bills){
  6. ????????????if(bill==5)?five++;
  7. ????????????else?if(bill==10){
  8. ????????????????if(five==0)?return?false;
  9. ????????????????five--,ten++;
  10. ????????????}
  11. ????????????else?if(bill=20){
  12. ????????????????if(ten>0&&five>0){
  13. ????????????????????ten--,five--,twenty++;
  14. ????????????????}
  15. ????????????????else?if(five>=3){
  16. ????????????????????five-=3,twenty++;
  17. ????????????????}
  18. ????????????????else?
  19. ????????????????????return?false;
  20. ????????????}
  21. ????????}
  22. ????????return?true;
  23. ????}
  24. };

406根據身高重建隊列

想不出來,不知道該怎么模擬。

力扣博主Sunny的題解:

漁(套路):一般這種數對,還涉及排序的,根據第一個元素正向排序,根據第二個元素反向排序,或者根據第一個元素反向排序,根據第二個元素正向排序,往往能夠簡化解題過程。

在本題目中,我首先對數對進行排序,按照數對的元素 1 降序排序,按照數對的元素 2 升序排序。原因是,按照元素 1 進行降序排序,對于每個元素,在其之前的元素的個數,就是大于等于他的元素的數量,而按照第二個元素正向排序,我們希望 k 大的盡量在后面,減少插入操作的次數。

作者:Sunny

鏈接:https://leetcode.cn/problems/queue-reconstruction-by-height/solutions/486493/xian-pai-xu-zai-cha-dui-dong-hua-yan-shi-suan-fa-g/

來源:力扣(LeetCode)

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

講得非常好,我們自己編程實現一下:

不會語法。

很好,學到新東西了,尤其是重載pair類運算符,還有insert記得傳入res.begin()的寫法:

  1. class?Solution?{
  2. public:
  3. ????//注意person是vector<int>?不是pair.因為是對內部的元素排,而內部元素是vector<int>類型
  4. ????static?bool?mycmp(vector<int>&a,vector<int>&b){
  5. ????????if(a[0]==b[0])?return?a[1]<b[1];
  6. ????????return?a[0]>b[0];
  7. ????}
  8. ????vector<vector<int>>?reconstructQueue(vector<vector<int>>&?people)?{
  9. ????????vector<vector<int>>?res;
  10. ????????sort(people.begin(),people.end(),mycmp);
  11. ????????for(auto?person:people){
  12. ????????????int?size=(int)res.size();
  13. ????????????if(person[1]>=size)
  14. ????????????????res.push_back(person);
  15. ????????????else?
  16. ???????????????res.insert(res.begin()+person[1],person);?
  17. ????????????
  18. ????????}
  19. ????????return?res;
  20. ????}
  21. };

學習代碼隨想錄的解法:

引用:

“本題有兩個維度,h和k,看到這種題目一定要想如何確定一個維度,然后再按照另一個維度重新排列。在135. 分發糖果?(opens new window)我就強調過一次,遇到兩個維度權衡的時候,一定要先確定一個維度,再確定另一個維度。”

思路一樣的,但是講解的話,力扣博主要更清晰易懂,以后優先看力扣博主的講解,都吸收。

這里相當于再寫一遍:

  1. class?Solution?{
  2. public:
  3. ????static?bool?mycmp(vector<int>&a,vector<int>&b){
  4. ????????if(a[0]==b[0])?return?a[1]<b[1];
  5. ????????return?a[0]>b[0];
  6. ????}
  7. ????vector<vector<int>>?reconstructQueue(vector<vector<int>>&?people)?{
  8. ????????vector<vector<int>>?res;
  9. ????????sort(people.begin(),people.end(),mycmp);
  10. ????????for(auto?person?:people){
  11. ????????????int?size=(int)(res.size());
  12. ????????????if(person[1]>=size)?res.push_back(person);
  13. ????????????else?res.insert(res.begin()+person[1],person);
  14. ????????}
  15. ????????return?res;
  16. ????}
  17. };

還需要額外學習手寫vector的insert操作:

  1. void?insert(vector<int>&?vec,?int?pos,?int?val)?{
  2. ????//?Check?if?the?position?is?valid
  3. ????if?(pos?<?0?||?pos?>?vec.size())?{
  4. ????????throw?invalid_argument("Position?is?out?of?range.");
  5. ????}
  6. ????//?Increase?the?size?of?the?vector
  7. ????vec.resize(vec.size()?+?1);
  8. ????//?Move?the?elements?after?the?position?to?create?space?for?the?new?element
  9. ????for?(int?i?=?vec.size()?-?1;?i?>?pos;?i--)?{
  10. ????????vec[i]?=?vec[i?-?1];
  11. ????}
  12. ????//?Insert?the?new?element
  13. ????vec[pos]?=?val;
  14. }

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

本題考察區間合并,在ACWING學了模版,但是已經記不起來了,還是得多學多做多復習(顯然不太可能,盡力吧):

還是寫不出來區間合并。仔細讀題,這題并不是單純的區間合并

復習ACWING區間合并,學習記憶ACWING模版,力扣高贊題解,代碼隨想錄題解、COZE的解法(主要還是要學會區間合并,COZE的解法并不能走天下)。已完成。

COZE:

注意先sort再去取end;

  1. class?Solution?{
  2. public:
  3. ????static?bool?mycmp(vector<int>&a,vector<int>&b){
  4. ????????return?a[1]<b[1];
  5. ????}
  6. ????int?findMinArrowShots(vector<vector<int>>&?points)?{
  7. ????????sort(points.begin(),points.end(),mycmp);
  8. ????????int?res=1,end=points[0][1];
  9. ????????for(int?i=1;i<points.size();i++){
  10. ????????????if(points[i][0]<=end)?continue;
  11. ????????????res++;
  12. ????????????end=points[i][1];
  13. ????????}
  14. ????????return?res;
  15. ????}
  16. };

Leetcode優質題解:

思路和上面一樣:有交集就好,沒交集就res++,并更新end;

代碼隨想錄官方題解:

學到了:如果按左端點來排序,那么應當從后向前開始遍歷。遇到重疊時候:重疊氣球的最小右邊界就是射箭地方。

  1. class?Solution?{
  2. public:
  3. ????static?bool?mycmp(vector<int>&a,vector<int>&b){
  4. ????????return?a[0]<b[0];
  5. ????}
  6. ????int?findMinArrowShots(vector<vector<int>>&?points)?{
  7. ????????int?result=1;
  8. ????????sort(points.begin(),points.end(),mycmp);
  9. ????????for(int?i=1;i<points.size();i++){
  10. ????????????//不重疊
  11. ????????????if(points[i][0]>points[i-1][1]){
  12. ????????????????result++;
  13. ????????????}
  14. ????????????//重疊
  15. ????????????else{
  16. ????????????????points[i][1]=min(points[i][1],points[i-1][1]);
  17. ????????????}
  18. ????????}
  19. ????????return?result;
  20. ????}
  21. };

ACWING803區間合并

有很多細節:-2e9,注意負號的位置。

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. using?namespace?std;
  5. const?int?N=100010;
  6. typedef?pair<int,int>?PII;
  7. vector<PII>?segs;
  8. //看一下const?N怎么用的?
  9. void?mymerge(vector<PII>&segs){
  10. ????sort(segs.begin(),segs.end());
  11. ????vector<PII>?res;
  12. ????int?st=-2e9,ed=-2e9;
  13. ????for(auto?seg:segs){
  14. ????????//無交集
  15. ????????if(ed<seg.first){
  16. ????????????if(st!=-2e9)?res.push_back({st,ed});
  17. ????????????st=seg.first,ed=seg.second;
  18. ????????}
  19. ????????//有交集
  20. ????????else{
  21. ????????????ed=max(seg.second,ed);
  22. ????????}
  23. ????}
  24. ????//防止空區間進入
  25. ????if(st!=-2e9)?res.push_back({st,ed});
  26. ????segs=res;
  27. }
  28. int?main(){
  29. ????int?n;
  30. ????scanf("%d",&n);
  31. ????while(n--){
  32. ????????int?l,r;
  33. ????????scanf("%d%d",&l,&r);
  34. ????????segs.push_back({l,r});
  35. ????}
  36. ????mymerge(segs);
  37. ????printf("%d\n",segs.size());
  38. ????return?0;
  39. }

學習貪心算法:

來源:

[一個視頻搞懂貪心算法]

(https://www.bilibili.com/video/BV1Hz4y117CP/?share_source=copy_web&vd_source=20ecc36fbdd0ac45969ae149b0333409)

  1. 分配問題。

分配餅干,因為饑餓度最小的孩子最容易吃飽,先考慮他。

做過了。

  1. 區間問題-Leetcode435 無重疊區間

在選擇要保留區間時,區間的結尾十分重要:選擇的區間結尾越小,余留給其它區間的空間就越大,就越能保留更多的區間。

因此,我們采取的貪心策略為,優先保留結尾小且不相交的區 間。具體實現方法為,先把區間按照結尾的大小進行增序排序,每次選擇結尾最小且和前一個選 擇的區間不重疊的區間。

給定多個區間,計算讓這些區間互不重疊所需要移除區間的最少個數。起止相連不算重疊。

  1. class?Solution?{
  2. public:
  3. ????static?bool?mycmp(vector<int>&a,vector<int>&b){
  4. ????????return?a[1]<b[1];
  5. ????}
  6. ????int?eraseOverlapIntervals(vector<vector<int>>&?intervals)?{
  7. ????????int?remove=0;
  8. ????????sort(intervals.begin(),intervals.end(),mycmp);
  9. ????????int?end=intervals[0][1];
  10. ????????for(int?i=1;i<intervals.size();i++){
  11. ????????????if(intervals[i][0]<end)?{
  12. ????????????????remove++;
  13. ????????????????continue;
  14. ????????????}
  15. ????????????end=intervals[i][1];
  16. ????????}
  17. ????????return?remove;
  18. ????}
  19. };

做出來了!不會也別怕,做過類似的就增長能力了,下次就能舉一反三。

  1. 買賣股票的最佳時機 Leetcode121,簡單

又不會了,因為當時沒徹底弄懂吧。

樸素法,超時了:

  1. class?Solution?{
  2. public:
  3. ????int?maxProfit(vector<int>&?prices)?{
  4. ????????int?res=INT_MIN;
  5. ????????for(int?i=0;i<prices.size()-1;i++){
  6. ?????????int?j=i+1;
  7. ?????????while(j<prices.size()){
  8. ????????????int?tmp=prices[j]-prices[i];
  9. ????????????if(tmp>res)?res=tmp;
  10. ????????????j++;
  11. ?????????}
  12. ????????}
  13. ????????if(res<0)?return?0;
  14. ????????return?res;
  15. ????}
  16. };

動態規劃:畫圖!

  1. class?Solution?{
  2. public:
  3. ????int?maxProfit(vector<int>&?prices)?{
  4. ????????int?pastprice=INT_MAX,res=0;
  5. ????????for(int?price:prices){
  6. ????????????res=max(res,price-pastprice);
  7. ????????????pastprice=min(price,pastprice);
  8. ????????}
  9. ????????return?res;
  10. ????}
  11. };

  1. 買賣股票的最佳時機ii,中等

畫圖發現,[1,4,6]不管是{1買入,4賣出;4買入,6賣出}還是{1買入,6賣出}結果一樣,所以每日res>0的話就加入到結果中:如果今天買明天賣能賺錢,那么就今天買入。

  1. class?Solution?{
  2. public:
  3. ????int?maxProfit(vector<int>&?prices)?{
  4. ????????if(prices.size()==1)?return?0;
  5. ????????int?pro=0;
  6. ????????for(int?i=1;i<prices.size();i++){
  7. ????????????int?res=prices[i]-prices[i-1];
  8. ????????????if(res>0)?pro+=res;
  9. ????????}
  10. ????????return?pro;
  11. ????}
  12. };

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

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

相關文章

基于springboot圖書個性化推薦系統源碼數據庫

基于springboot圖書個性化推薦系統源碼數據庫 本論文主要論述了如何使用JAVA語言開發一個圖書個性化推薦系統&#xff0c;本系統將嚴格按照軟件開發流程進行各個階段的工作&#xff0c;采用B/S架構&#xff0c;面向對象編程思想進行項目開發。在引言中&#xff0c;作者將論述圖…

K8s 運維架構師實戰課程

阿良課程收益 掌握Kubernetes企業運維管理 掌握部署、運維、存儲、網絡、監控、日志、CICD、服務網格等實戰全面搞定&#xff01; 獨立將公司任何項目容器化遷移到K8s平臺 生產環境真實案例 大廠企業實戰經驗 學習最新版、最佳實踐 K8s 運維架構師實戰【初中級】&#xff1a;ht…

docker 方式gost代理搭建以及代理鏈實施

一、項目地址&#xff1a;https://github.com/ginuerzh/gost 二、實施 環境信息 主機名公網IP地址內網IP地址角色beijing101.200.xxx.xxx192.168.0.160單層代理serverbeijing101.200.xxx.xxx192.168.0.160鏈式代理下游serverhk47.238.xxx.xxx172.31.94.207鏈式代理上游serve…

linux誤刪crontab定時任務后的補救措施(隨手記)

起因 想看一眼定時任務的時候&#xff0c;手誤打成了-r&#xff0c;接著我的定時任務就全沒了…… 補救措施 我們都知道&#xff0c;crontab的幾個關鍵目錄中有一個是/var/log/cron&#xff0c;這個目錄記錄了crontab執行的日志。 如果平時沒有備份crontab的習慣的話&#x…

【MySQL精通之路】InnoDB-內存結構-自適應哈希索引

1.作用 自適應哈希索引使InnoDB能夠在具有適當的工作負載組合和足夠的緩沖池內存的系統上執行更像內存中的數據庫&#xff0c;而不會犧牲事務特性或可靠性。 2.設置 自適應哈希索引由innodb_adaptive_hash_index變量啟用 或在服務器啟動時由--skip-innodb-adaptive-has…

VMware 安裝Windows Server 2008 R2

1.下載鏡像 迅雷&#xff1a;ed2k://|file|cn_windows_server_2008_r2_standard_enterprise_datacenter_and_web_with_sp1_x64_dvd_617598.iso|3368839168|D282F613A80C2F45FF23B79212A3CF67|/ 2.安裝過程 自定義名字&#xff0c;點擊【瀏覽】選擇安裝路徑 點擊【瀏覽】選擇前…

鴻蒙應用開發系列 篇三:ArkTS語言

文章目錄 系列文章概述基本語法基本結構概念釋疑聲明式UI描述高級特性自定義組件頁面和自定義組件生命周期狀態管理渲染控制ArkTS語言基礎類庫系列文章 鴻蒙應用開發系列 篇一:鴻蒙系統概述 鴻蒙應用開發系列 篇二:鴻蒙系統開發工具與環境

(Oracle)SQL優化基礎(三):看懂執行計劃順序

往期內容&#xff1a; &#xff08;Oracle&#xff09;SQL優化基礎&#xff08;一&#xff09;&#xff1a;獲取執行計劃 &#xff08;Oracle&#xff09;SQL優化基礎&#xff08;二&#xff09;&#xff1a;統計信息 獲取到執行計劃后&#xff0c;對于新手朋友來講可能不知道…

Qt筆記:動態處理多個按鈕點擊事件以更新UI

問題描述 在開發Qt應用程序時&#xff0c;經常需要處理多個按鈕的點擊事件&#xff0c;并根據點擊的按鈕來更新用戶界面&#xff08;UI&#xff09;&#xff0c;如下圖。例如&#xff0c;你可能有一個包含多個按鈕的界面&#xff0c;每個按鈕都與一個文本框和一個復選框相關聯…

基于springboot+vue+Mysql的逍遙大藥房管理系統

開發語言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

Flutter 中的 FormField 小部件:全面指南

Flutter 中的 FormField 小部件&#xff1a;全面指南 在Flutter的世界里&#xff0c;表單是用戶輸入數據的基本方式之一。FormField是一個強大的小部件&#xff0c;它將表單字段的創建、驗證和管理集成到了一個易于使用的抽象中。本文將為您提供一個全面的指南&#xff0c;幫助…

AWS安全性身份和合規性之AWS Firewall Manager

AWS Firewall Manager是一項安全管理服務&#xff0c;可讓您在AWS Organizations中跨賬戶和應用程序集中配置和管理防火墻規則。在創建新應用程序時&#xff0c;您可以借助Firewall Manager實施一套通用的安全規則&#xff0c;更輕松地讓新應用程序和資源從一開始就達到合規要求…

【flutter】 Running Gradle task ‘assembleDebug‘...超時問題

關聯搜索&#xff1a;flutter下載gradle失敗、AndroidStudio下載gradle失敗 構建Flutter項目時遇到控制臺一直卡在 Running Gradle task ‘assembleDebug’… 解決方案 1. 修改gradle-wrapper.properties 文件 如果找不到就直接搜索&#xff1a; 把https\://services.gradl…

vscode更改語言,記錄一下

首先打開安裝好的Vscode軟件&#xff0c;可以看到頁面上顯示的是英文效果。 同時按鍵ctrlshiftp&#xff0c;接著在輸入框中輸入 configure Display language如圖&#xff1a; 選擇中文簡體就ok了&#xff0c;如果沒有則安裝 chinese Language pack

大模型日報2024-05-23

大模型日報 2024-05-23 大模型資訊 減少生成型AI和大型語言模型中的幻覺現象 摘要: Phocuswright即將發布全面報告《從流行詞到實際效益&#xff1a;跟上旅游業中生成型AI的步伐》。該報告預覽指出&#xff0c;降低生成型人工智能及大型語言模型在生成內容時出現的幻覺現象是行…

git二次上傳文件夾、文件

主要記錄自己遇到的問題。 一、報錯error:failed to push somes ref to..... 報錯&#xff1a;error the following untracked working tree files would be overwritten bt merge... 把報錯的&#xff08;重復的文件刪除&#xff09; git init git add -f 文件夾/文件名…

vue 使用iView組件中的Table實現定時自動滾動

封裝Table 要在css中設置table的高度&#xff0c;使數據過多時出現滾動條&#xff0c;將縱向設置為overflow-y: auto;橫向設置隱藏 overflow-x: hidden; <template><div class"table_container"><Table :loading"tableLoading" :columns&qu…

vue3 ElementUI 日期禁選當日前, 當日后,幾天后,幾天前(例如3天后)

今日之前禁用 代碼: ( 主要是 :disabledDate“disabledDateFun” ) <el-date-picker v-model"queryForm.selectedDate"type"date"range-separator"-"placeholder"選擇日期":disabledDate"disabledDateFun" clearable /&…

前端面試:項目細節重難點問題分享

面試官提問&#xff1a;我現在給你出一個項目實際遇到的問題&#xff1a;由于后端比較忙&#xff0c;所以我們這邊的列表數據排序需要前端最近實現&#xff0c;那你會怎么實現排序呢&#xff1f; 答&#xff1a;我的回答&#xff1a;確實&#xff0c;數據都是由后端實現的&…

kotlin基礎之空指針檢查、字符串表達式、函數默認值

Kotlin 的空指針檢查 Kotlin 是一種空安全的語言&#xff0c;這意味著它強制開發者明確地處理可能的空值。在 Kotlin 中&#xff0c;所有的變量默認都是非空的&#xff0c;除非顯式地標記為可為空。 聲明可為空的變量 你可以通過在類型后面添加 ? 來聲明一個變量可以為空&a…