Leetcode - 周賽386

目錄

一,3046. 分割數組

二,3047. 求交集區域內的最大正方形面積

三,3048. 標記所有下標的最早秒數 I

四,3049. 標記所有下標的最早秒數 II


一,3046. 分割數組

將題目給的數組nums分成兩個數組,且這兩個數組中沒有相同的元素,求是否存在這兩個數組,即求nums數組中有沒有一個元素的出現次數 > 2,如果大于2,說明不論怎么分配總有一個數組含有相同的元素,返回 false,否則返回 true

代碼如下:

class Solution {public boolean isPossibleToSplit(int[] nums) {int mx = 0;Map<Integer,Integer> map = new HashMap<>();for(int x : nums){map.put(x, map.getOrDefault(x,0)+1);mx = Math.max(mx, map.get(x));}return mx <= 2;}
}

二,3047. 求交集區域內的最大正方形面積

本題求兩個矩陣的交集區域中最大正方形的面積,關鍵在于求出相交區域的矩陣的長和高:

  • 左下角的橫坐標(x軸):兩個矩陣左下角最大的橫坐標
  • 左下角的縱坐標(y軸):兩個矩陣左下角最大的縱坐標
  • 右上角的橫坐標(x軸):兩個矩陣右上角最小的橫坐標
  • 右上角的縱坐標(y軸):兩個矩陣右上角最小的橫坐標

代碼如下:

class Solution {public long largestSquareArea(int[][] bottomLeft, int[][] topRight) {long ans = 0;int n = bottomLeft.length;for(int i=0; i<n; i++){int[] b1 = bottomLeft[i];int[] t1 = topRight[i];for(int j=i+1; j<n; j++){int[] b2 = bottomLeft[j];int[] t2 = topRight[j];int LMx = Math.min(t1[0], t2[0]);int LMn = Math.max(b1[0], b2[0]);int RMn = Math.max(b1[1], b2[1]);int RMx = Math.min(t1[1], t2[1]);int x = Math.min(LMx-LMn, RMx-RMn);if(x > 0)ans = Math.max(ans,(long)x*x);}}return ans;}
}

三,3048. 標記所有下標的最早秒數 I

二分 + 貪心

本題的題目可以轉換成一個更加簡單易懂的說法 —— 學校考試:

距離學期結束還有 m 天,要復習?n 門課程,第 i 門課程的復習時間是nums[i],并且每一門課程的考試時間是固定的,由changeIndices數組決定(changIndices[i] 表示可以在第 i 天考第 changIndices[i] 門課程),問要將 n 門課程復習完+考完(考試當天只能用來考試),最少要花費多少時間?

通過讀題,會發現直接求答案是非常困難的,那么是否可以通過枚舉最終所需的天數來判斷它是否夠用,如果夠用,那么縮減天數,如果不夠用,那么增加天數,想到這,自然就會想到二分答案,但是使用二分還有一個前提:要具有單調性,那么本題是否有單調性呢?當然是有的:給的時間越多,復習的時間越充裕,越能夠通過考試。

二分是可以的,那么接下來就是判斷二分的這個答案是否成立(即如何判斷所給的天數是否充足),有兩種思考方式,一種從前往后思考,一種從后往前思考,這里只講第一種思路:

通過上面的分析,我們知道考試的時間越靠后,復習的時間就越多,就越能夠通過考試,所以我們需要求出每一門課程的最后一天考試時間,從前往后遍歷:

  • 如果第 i 天不是某一門課程的最后一天考試天數,那么我們將這一天存起來(即cnt++),cnt 用作之后考試課程的復習天數
  • 如果第 i 天是某一門課程的最后一天考試天數,那么先判斷我們是否有足夠的時間cnt去復習這門課程,如果有,cnt 減去需要復習的天數,如果沒有返回 false
  • 遍歷結束返回 true

畫個圖理解一下:

?代碼如下:

class Solution {public int earliestSecondToMarkIndices(int[] nums, int[] changeIndices) {int n = nums.length;int m = changeIndices.length;int[] last_test = new int[n];int l = n, r = m;while(l <= r){int mid = (l + r) / 2;if(check(nums, changeIndices, last_test, mid)){r = mid - 1;}else{l = mid + 1;}}return r+1 > m ? -1 : r+1;}boolean check(int[] nums, int[] changeIndices, int[] last_test, int lastDay){Arrays.fill(last_test, -1);for(int i=0; i<lastDay; i++){//求每一門考試在規定時間(lastDay)內的最后的考試時間last_test[changeIndices[i]-1] = i;}for(int x : last_test){//在規定時間內沒有該課程的考試機會if(x < 0) return false;}int cnt = 0;for(int i=0; i<lastDay; i++){int idx = changeIndices[i]-1;//第i天的可以考試的課程if(last_test[idx]==i){if(cnt < nums[idx])return false;cnt -= nums[idx];}else{cnt++;}}return true;}
}

簡單講一下后往前遍歷的思路:和第一個思路一樣,只不過這里是透支復習的時間,也就是先考試,復習的天數先欠著,之后再還。(個人認為第一種更好理解,這種看不懂也沒事)

代碼如下:

class Solution {public int earliestSecondToMarkIndices(int[] nums, int[] changeIndices) {int n = nums.length;int m = changeIndices.length;if (n > m) return -1;int[] done = new int[n]; // 避免反復創建和初始化數組int left = n - 1, right = m + 1;while (left + 1 < right) {int mid = (left + right) / 2;if (check(nums, changeIndices, done, mid)) {right = mid;} else {left = mid;}}return right > m ? -1 : right;}private boolean check(int[] nums, int[] changeIndices, int[] done, int mx) {int exam = nums.length;int study = 0;for (int i = mx - 1; i >= 0 && study <= i + 1; i--) { // 確保剩余的天數>要復習的天數int idx = changeIndices[i] - 1;if (done[idx] != mx) {//判斷是否考過試done[idx] = mx;exam--; // 考試study += nums[idx]; // 需要復習的天數} else if (study > 0) {study--; // 復習}}return exam == 0 && study == 0; // 考完了并且復習完了}
}

四,3049. 標記所有下標的最早秒數 II

二分 + 反悔貪心

該題和上一題有兩個不一樣的地方:

1)可以在第 i 天,一天就復習完 changIndices[i] 這門課程(快速復習)

2)可以在任意一天考任意一門課程

這里有一個需要注意的點:快速復習和慢速復習(一天一天復習,復習nums[i]天)是沖突的,會造成浪費,也就是說,一門課程要么使用快速復習,要么使用慢速復習,可以使用反證法證明,當一門課程即使用快速復習,又使用慢速復習,就會浪費慢速復習的時間。

還有一個問題,快速復習的時間是越早越好還是越晚越好?這點可以從貪心的思路去想,復習完的時間越早,就有更加充足的時間去考試,所以答案是越早越好。統計所有課程最早的快速復習時間。

根據上一題來看,這道題是否也可以使用二分答案去做呢?這也是可以的,因為它的單調性還與上道題一樣:給的時間越多,復習的時間越充裕,越能夠通過考試。

如何判斷所給的天數是否充足,這道題只能從后往前遍歷,因為從前往后遍歷的話,無法知道是否有足夠的時間用來考試。

從后往前遍歷:

  • 當天不是一門課程快速復習的最早時間,cnt += 1
  • 當天是一門課程快速復習的最早時間:
  1. cnt>0,即有時間去考試,那么消耗一天去考試,cnt-=1
  2. nums[i]=0,即不需要時間復習,cnt+=1
  3. nums[i]=1,可以通過慢速復習,cnt+=1
  4. cnt=0,即沒有時間去考試,但是不意味著該門課程一定是慢速復習,可以通過反悔貪心,去看看有沒有原本使用快速復習,且nums[i]最小的課程,如果有,反悔這門課(快速復習一天+考試一天),多出來的這兩天,用來做當天這門課的快速復習+考試

最后看看剩下的使用慢速復習+考試的天數是否大于實際上的慢速復習+考試的天數

代碼如下:

class Solution {public int earliestSecondToMarkIndices(int[] nums, int[] changeIndices) {int n = nums.length;int m = changeIndices.length;if(n > m) return -1;long slow = n;for(int x : nums) slow += x;//統計慢速復習+考試需要多長時間int[] firstT = new int[n];//快速復習越早越好,這樣就可以留更多的時間去考試Arrays.fill(firstT, -1);for(int i=m-1; i>=0; i--)firstT[changeIndices[i]-1] = i;PriorityQueue<Integer> que = new PriorityQueue<>((a,b)->a-b);int l = n, r = m;while(l <= r){que.clear();int mid = (l+r)/2;if(check(nums, changeIndices, firstT, que, slow, mid)){r = mid - 1;}else{l = mid + 1;}}return r+1>m ? -1 : r+1;}boolean check(int[] nums, int[] changeIndices, int[] firstT, PriorityQueue<Integer> que, long slow, int lastDay){int cnt = 0;//表示有多少時間可以用來慢速復習+考試for(int i=lastDay-1; i>=0; i--){//從后向前遍歷int idx = changeIndices[i]-1;//當天可以快速復習的課程下標int x = nums[idx];//該課程需要幾天復習if(x <= 1 || i != firstT[idx]){//復習1天 || 不是最早的快速復習時間 -> 可以使用慢速復習搞定cnt++;//當天可以用來慢速復習/考試continue;}if(cnt == 0){//復習>1天 && 是最早的快速復習時間沒有慢速復習 && 沒有時間用來考試 -> 看看有沒有更節省的方式if(que.isEmpty() || x<=que.peek()){cnt++;//當天可以用來慢速復習/考試 即 該課程只能使用慢速復習continue;}slow += que.poll() + 1;//否則可以使que.poll()課程慢速復習+一天考試cnt += 2;//可以返還que.poll()課程所需的 1天快速復習 + 1天考試}slow -= x + 1;//減去當前課程復習天數+考試所需的一天cnt--;//當天快速復習 + 后面一天考試que.offer(x);}return cnt >= slow;//剩余留給慢速復習+考試的時間 > 實際所需慢速復習+考試的時間}
}

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

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

相關文章

探索RedisJSON:將JSON數據力量帶入Redis世界

探索RedisJSON&#xff1a;將JSON數據力量帶入Redis世界 當我們談論數據存儲和查詢時&#xff0c;Redis和JSON都是無法忽視的重要角色。Redis以其高效的鍵值存儲、快速的讀/寫速度、以及豐富的數據結構贏得了開發者的喜愛。而JSON&#xff0c;作為一種輕量級的數據交換格式&am…

「Vue3系列」Vue3 條件語句/循環語句

文章目錄 一、Vue3 條件語句1. v-if2. v-else-if 和 v-else3. v-show4. 使用計算屬性進行條件渲染5. v-if與v-show比較v-ifv-show性能考慮使用場景 二、Vue3 循環語句1. 遍歷數組2. 遍歷對象3. 使用索引4. 注意事項 三、相關鏈接 一、Vue3 條件語句 在 Vue 3 中&#xff0c;你…

盲人出行:科技創造美好的未來

在繁忙的都市中&#xff0c;我每天都要面對許多挑戰&#xff0c;盲人出行安全保障一直難以得到落實。我看不見這個世界&#xff0c;只能依靠觸覺和聽覺來感知周圍的一切。然而&#xff0c;我從未放棄過對生活的熱愛和對未來的憧憬。在一次機緣巧合下&#xff0c;我認識了一款名…

C3_W2_Collaborative_RecSys_Assignment_吳恩達_中英_Pytorch

Practice lab: Collaborative Filtering Recommender Systems(實踐實驗室:協同過濾推薦系統) In this exercise, you will implement collaborative filtering to build a recommender system for movies. 在本次實驗中&#xff0c;你將實現協同過濾來構建一個電影推薦系統。 …

VLAN實驗報告

實驗要求&#xff1a; 實驗參考圖&#xff1a; 實驗過程&#xff1a; r1: [r1]int g 0/0/0.1 [r1-GigabitEthernet0/0/0.1]ip address 192.168.1.1 24 [r1-GigabitEthernet0/0/0.1]dot1q termination vid 2 [r1-GigabitEthernet0/0/0.1]arp broadcast enable [r1]int g 0/0/…

Mysql學習之MVCC解決讀寫問題

多版本并發控制 什么是MVCC MVCC &#xff08;Multiversion Concurrency Control&#xff09;多版本并發控制。顧名思義&#xff0c;MVCC是通過數據行的多個版本管理來實現數據庫的并發控制。這項技術使得在InnoDB的事務隔離級別下執行一致性讀操作有了保證。換言之&#xff0…

django的模板渲染中的【高級定制】:按數據下標id來提取數據

需求&#xff1a; 1&#xff1a;在一個頁面中顯示一張數據表的數據 2&#xff1a;不能使用遍歷的方式 3&#xff1a;頁面中的數據允許通過admin后臺來進行修改 4&#xff1a;把一張數據表的某些內容渲染到[xxx.html]頁面 5&#xff1a;如公司的新商品頁面&#xff0c;已有固定的…

《夢幻西游》本人收集的34個單機版游戲,有詳細的視頻架設教程,值得收藏

夢幻西游這款游戲&#xff0c;很多人玩&#xff0c;喜歡研究的趕快下載吧。精心收集的34個版本。不容易啊。里面有詳細的視頻架設教程&#xff0c;可以外網呢。 《夢幻西游》本人收集的34個單機版游戲&#xff0c;有詳細的視頻架設教程&#xff0c;值得收藏 下載地址&#xff1…

FDM打印機學習

以下內容摘自網絡&#xff0c;僅供學習討論&#xff0c;侵刪。 持續更新。。。 FDM打印機是通過噴頭融化絲狀耗材&#xff08;PLA&#xff0c;ABS等材料&#xff09;&#xff0c;然后逐層涂在熱床上&#xff0c;一層一層逐級抬高。 結構分類 Prusa i3型是一種龍門結構&#…

JavaWeb 下拉菜單怎么實現選擇不同的顏色?

在JavaWeb中實現下拉菜單選擇不同顏色的功能是一種常見的需求&#xff0c;可以通過HTML、CSS和JavaScript結合Java后端來實現。 第一步&#xff1a;編寫HTML頁面 首先&#xff0c;我們需要創建一個HTML頁面&#xff0c;其中包含一個下拉菜單和一個用于顯示顏色的區域。 <…

python 爬取文本內容并寫入json文件

背景: 項目需要從html 提取說明書目錄 實現: 由于html是包含所有內容,所以將其中目錄部分手動重新生成一個html 文件dir26.html python import requests from bs4 import BeautifulSoup import jsonfilename "dir26.html" # 替換為實際的文件路徑 with open(fil…

ES 備份索引

1、先創建索引 PUT file_info_sps_demo1 {"settings": {"index": {"number_of_shards": "1","blocks": {"read_only_allow_delete": "true"},"max_result_window": "500000",&quo…

階躍信號與沖擊信號

奇異信號&#xff1a;信號與系統分析中&#xff0c;經常遇到函數本身有不連續點&#xff08;跳變電&#xff09;或其導函數與積分有不連續點的情況&#xff0c;這類函數稱為奇異函數或奇異信號&#xff0c;也稱之為突變信號。以下為一些常見奇異函數。 奇異信號 單位斜變信號 …

C#雙向鏈表實現:Append()方法追加并顯示數據

目錄 一、涉及到的知識點 1.定義 2.雙向鏈表與單向鏈表的區別 二、實例 一、涉及到的知識點 1.定義 在雙向鏈表中&#xff0c;每個節點有兩個指針域&#xff0c;一個指向它的前一個節點&#xff08;即直接前驅&#xff09;&#xff0c;另一個指向它的后一個節點&#xff0…

Ubuntu18.04安裝RTX2060顯卡驅動+CUDA+cuDNN

Ubuntu18.04安裝RTX2060顯卡驅動CUDAcuDNN 1 安裝RTX2060顯卡驅動1.1 查看當前顯卡是否被識別1.2 安裝驅動依賴1.3 安裝桌面顯示管理器1.4 下載顯卡驅動1.5 禁用nouveau1.6 安裝驅動1.7 查看驅動安裝情況 2 安裝CUDA2.1 查看當前顯卡支持的CUDA版本2.2 下載CUDA Toolkit2.3 安裝…

車燈修復UV膠的優缺點有哪些?

車燈修復UV膠的優點如下&#xff1a; 優點&#xff1a; 快速固化&#xff1a;通過紫外光照射&#xff0c;UV膠可以在5-15秒內迅速固化&#xff0c;提高了修復效率。高度透明&#xff1a;固化后透光率高&#xff0c;幾乎與原始車燈材料無法區分&#xff0c;修復后車燈外觀更加…

對緩沖區的初步認識——制作進度條小程序

對緩沖區的初步認識--進度條小程序 前言預備知識回車和換行的區別輸出緩沖區/n 有清空輸出緩沖區的作用stdout是什么&#xff1f;驗證一切皆文件為什么是\n行刷新&#xff1f; 倒計時程序原理 代碼實現為什么這里要強制刷新&#xff1f;沒有會怎樣&#xff1f;為什么是輸出的是…

RabbitMQ安裝及使用

系列文章目錄 文章目錄 系列文章目錄前言一、下載二、安裝三、插件安裝四、配置五、權限六、集群模式 前言 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站&#xff0c;這篇文章男女通用&…

【MATLAB源碼-第154期】基于matlab的OFDM系統多徑信道下塊狀和梳妝兩種導頻插入方式誤碼率對比仿真。

操作環境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;Orthogonal Frequency Division Multiplexing&#xff0c;正交頻分復用&#xff09;是一種高效的無線信號傳輸技術&#xff0c;廣泛應用于現代通信系統&#xff0c;如Wi-Fi、LTE和5G。OFDM通過將寬帶信道劃分…

[機緣參悟-158] :西游記中的“佛” 、“道”之爭

目錄 前言 一、西游記中的佛教元素 1.1 佛教元素 1.2 西游記佛教思想 1.3 佛教的三界五行&#xff1a;物質世界 1.4 佛教中不在三界內&#xff0c;不在五行中&#xff1a;精神世界 二、西游記中的道教元素 2.1 主要元素 2.2 道家思想 三、“佛”如何兼容“道” 3.1 …