LeetCode---386周賽

題目列表

3046. 分割數組

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

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

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

一、分割數組

這題簡單的思維題,要想將數組分為兩個數組,且分出的兩個數組中數字不會重復,很顯然一個數字出現次數最多兩次,代碼如下

class Solution {
public:bool isPossibleToSplit(vector<int>& nums) {unordered_map<int,int>mp;for(auto x:nums)if(++mp[x]>2)return false;return true;}
};

二、求交集區域內的最大正方形面積

直接暴力枚舉出所有兩個矩陣的交集的正方形面積,求解出最大值,代碼如下

class Solution {
public:long long largestSquareArea(vector<vector<int>>& bLeft, vector<vector<int>>& tRight) {int n=bLeft.size(),w=0;for(int i=1;i<n;i++){for(int j=i-1;j>=0;j--){//挑選四個直線,圍成交集區域int x_l=max(bLeft[i][0],bLeft[j][0]);int x_r=min(tRight[i][0],tRight[j][0]);int y_top=min(tRight[i][1],tRight[j][1]);int y_bottom=max(bLeft[i][1],bLeft[j][1]);if(x_l<x_r&&y_top>y_bottom){//確保會有交集w=max(w,min(x_r-x_l,y_top-y_bottom));}}    }return 1LL*w*w;}
};

三、標記所有下標的最早秒數I

題目問最早秒數,我們正常來說都會想到貪心 / 從小到大枚舉驗證,其中貪心,大家可以去試著想想,因為需要從左往右遍歷時間,而我們不知道后面changeIndices[]的情況,所以就不能去決定這一步去做什么操作會比較好,也就很難去貪心。

那么我們來看看枚舉驗證行不行?一旦數據不好,估計得驗證O(n)次,大概率會超時,所以我們要降低時間復雜度,怎么做?--- 二分

1、是否滿足二分條件,即單調性?

根據題目所給的條件,我們知道時間越多,我們越有可能將nums[i]減為零,越有可能標記所有下標,即秒數越多越能滿足條件,符合單調性,可以二分

2、如何驗證是否能在k秒內標記所有下標,即bool check(int k)函數如何寫?(如果下面的內容不理解,可以先看看下面加粗的內容)

首先,由于changeIndices[]是不可預知的,即標記操作是不可控的,所以我們優先考慮什么時候標記下標的問題,根據貪心,我們肯定是越晚標記下標越好,這樣會有更多的時間將nums[i]減為零,所以我們要知道每個下標的最晚標記時間

然后在來考慮是否能在下標 i 的最晚標記時間之前,將nums[i]減為零,這個就很簡單了,我們只要維護一個cnt來記錄到目前為止有多少時間,然后在到達某個最晚標記時間時,如果cnt>=nums[i],cnt = cnt - nums[i],否則直接返回false,如果所有下標都能被標記就返回true (很顯然check函數的時間復雜度為O(n),所以暴力枚舉會超時,需要二分)

如果大家不是很理解,可以將這題轉換成考試來看,即一共有n門課程,nums[i]表示第 i 門課程的復習天數,changeIndices[i]表示第 i 天進行考試的課程,問復習完并考完所有課程的最少天數是多少?相信經歷了這么多年考試的你們,會更容易理解復習和考試的關系(doge)

代碼如下

/*
將問題轉換成一共有n門課程,第i門課程的復習時間為nums[i]天
changeIndices[i]課程的考試時間為第i天
復習并考完所有課程的最小時間由于考試時間是固定的,我們需要優先考慮考試時間
=> 考試時間越靠后,就會有更加充分的時間用來復習
=> 具有單調性
=> 可以二分check函數如何去判斷是否能復習考完所有的考試?
1、貪心,我們把每門課程的考試時間盡可能往后拖延  last[]記錄每門課程的最遲考試時間
2、如果考試數目<=課程數,return false; // 可以優化的點否則我們從前往后遍歷天數,優先復習考試時間近的科目,看能否在考試之前完成復習
*/class Solution {
public:int earliestSecondToMarkIndices(vector<int>& nums, vector<int>& changeIndices) {int n=nums.size(),m=changeIndices.size();auto check=[&](int k)->bool{vector<int>last(n,-1); // 記錄下標i的最晚標記時間,即最晚考試時間for(int i=0;i<k;i++)last[changeIndices[i]-1]=i;for(auto x:last)if(x<0) // 表示有的下標沒有被標記的時間,即有的課程沒有考試return false;int cnt = 0;for(int i=0;i<k;i++){int idx = changeIndices[i] - 1;if(last[idx]==i){//表示下標idx到了最后的被標記的時間,即課程到了考試的最后截止時間cnt-=nums[idx];if(cnt<0) return false;//沒有足夠的時間將nums[idx]置為0,即沒有足夠的時間復習課程}else{cnt++;}}return true;};int l=1,r=m;while(l<=r){int mid = l+(r-l)/2;if(check(mid)) r=mid-1;else l=mid+1;}return l>m?-1:l;}
};

四、標記所有下標的最早秒數II

有情提醒一下: 該題和第三題的題目并不一樣。

在這題中,操作變得更加復雜了,但其實我們還是可以借鑒第三題的思路:

首先,這題依舊能夠二分,因為時間越多,越有可能標記所有下標,但是check函數的思路不一樣了,我們要優先考慮清零操作,因為它是不可控的(為了方便描述,這里將題目中的幾個操作分別稱為減一、清零、標記)。

【如果下面的內容看不太明白,依舊可以帶入上一題說的考試模型,幫助你理解---減一操作:花費一天復習一門課,清空操作:花費一天速通一門課,標記:選擇一天用來考試】

1)這里就要討論一下:清零操作和減一操作什么時候用比較合適?

1、如果nums[i]用過減一操作,還需要用清零操作嗎?沒必要,因為如果能清零,就沒必要在花多余的時間進行減一,可以將多出的時間給其他的nums[j]

2、如果nums[i]用過清零操作,也就不需要在進行減一操作了

結論:對于nums[i]要么執行清零操作,要么就執行減一操作,不能混用

2)根據貪心:我們肯定是能清零就盡量的去執行清零,讓被清零的nums[i]有更多的時間被減為0

1、清零操作是越早越好還是越晚越好?肯定是越早越好,因為我們還需要有多余的時間去標記,所以我們需要從后往前遍歷,去看是否有多余的時間去標記下標,所以我們要記錄每個下標的最早清零時間

2、什么時候不需要用清零操作?

  • nums[i]==0時,不需要
  • nums[i]==1時,也不需要,因為減一操作也能做到清零,且可以在任意時間執行

除了上面的兩種情況,還有一種特殊的情況,即用完清零操作之后就沒時間進行標記了,這里我們不是只能進行對 i 下標進行nums[i]次減一操作,而是可以看之前進行清空操作的下標中nums[j]的最小值 是否 比nums[i]小,如果小,那么顯然我們可以對 j 下標進行nums[j]次減一操作,同時nums[i]就會有時間進行清零和標記,這樣的方案顯然會更優----反悔貪心

我們從后往前遍歷,同時維護用來標記/減一的時間cnt 和 需要減一和標記的總時間sum(都不包含進行清零操作的下標的標記時間)具體如何維護看下面的代碼。

class Solution {
public:int earliestSecondToMarkIndices(vector<int>& nums, vector<int>& changeIndices) {int n=nums.size(),m=changeIndices.size();long long total = n;for(auto x:nums) total += x;            vector<int>first_d(n,-1);for(int i=m-1;i>=0;i--)first_d[changeIndices[i]-1]=i;auto check=[&](int k)->bool{priority_queue<int,vector<int>,greater<int>> q;int cnt = 0;// 減一復習并考試的課程的所有時間long long slow = total;//記錄減一操作的nums[i]及其標記需要的時間,一開始默認全用減一操作for(int i=k-1;i>=0;i--){int idx=changeIndices[i]-1;if(nums[idx]<=1||i!=first_d[idx]){cnt++;continue;}if(cnt==0){if(q.empty()||nums[idx]<=q.top()){//只能進行減一操作cnt++;continue;}slow += q.top()+1;q.pop();cnt += 2;}slow -= nums[idx]+1;cnt--;q.push(nums[idx]);}return cnt>=slow;};int l=1,r=m;while(l<=r){int mid=l+(r-l)/2;if(check(mid)) r=mid-1;else l=mid+1;}return l>m?-1:l;}
};

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

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

相關文章

Redis 的哨兵模式配置

1.配置 vim sentinel.conf# mymaster 給主機起的名字 # 192.168.205.128 主機的ip地址 # 6379 端口號 # 2 當幾個哨兵發現主觀宕機&#xff0c;則判定為客觀宕機。 原則上是大于一半。比如三個哨兵&#xff0c;則設置為 2 sentinel monitor mymaster 192.168.205.128 63…

【動態規劃入門】01背包問題

每日一道算法題之01背包問題 一、題目描述二、思路三、C++代碼四、結語一、題目描述 題目來源:Acwing 有N件物品和一個容量是 V的背包。每件物品只能使用一次。第 i件物品的體積是 vi,價值是 wi。 求解將哪些物品裝入背包,可使這些物品的總體積不超過背包容量,且總價值最大…

LeetCode題練習與總結:合并K個升序鏈表

一、題目 給你一個鏈表數組&#xff0c;每個鏈表都已經按升序排列。 請你將所有鏈表合并到一個升序鏈表中&#xff0c;返回合并后的鏈表。 二、解題思路 創建一個最小堆&#xff08;優先隊列&#xff09;來存儲所有鏈表的頭節點。這樣我們可以始終取出當前所有鏈表中值最小…

人工智能指數報告2023

人工智能指數報告2023 主要要點第 1 章 研究與開發第 2 章 技術性能第 3 章 人工智能技術倫理第 4 章 經濟第 5 章 教育第 6 章 政策與治理第 7 章 多樣性第 8 章 輿論 人工智能指數是斯坦福大學以人為本的人工智能研究所&#xff08;HAI&#xff09;的一項獨立倡議&#xff0c…

Java 石頭剪刀布小游戲

一、任務 編寫一個剪刀石頭布游戲的程序。程序啟動后會隨機生成1~3的隨機數&#xff0c;分別代表剪刀、石頭和布&#xff0c;玩家通過鍵盤輸入剪刀、石頭和布與電腦進行5輪的游戲&#xff0c;贏的次數多的一方為贏家。若五局皆為平局&#xff0c;則最終結果判為平局。 二、實…

redis 為什么會阻塞

目錄 前言 客戶端交換時的阻塞 redis 磁盤交換的阻塞 主從節點交互的阻塞 切片集群交互時的阻塞 異步執行的演變 redis 異步執行如何實現的 前言 大家對redis 比較熟悉吧&#xff0c;只要做項目都會用到redis&#xff0c;提高系統的吞吐。小米商城搶購高峰18k的qps&…

KubeSphere平臺安裝系列之三【Linux多節點部署KubeSphere】(3/3)

**《KubeSphere平臺安裝系列》** 【Kubernetes上安裝KubeSphere&#xff08;親測–實操完整版&#xff09;】&#xff08;1/3&#xff09; 【Linux單節點部署KubeSphere】&#xff08;2/3&#xff09; 【Linux多節點部署KubeSphere】&#xff08;3/3&#xff09; **《KubeS…

一句話講清楚數據庫中事務的隔離級別(通俗易懂版)

為什么我只說通俗易懂版不說嚴謹版? 因為嚴謹版遍地都是, 但是他們卻有一個缺點就是讓人看得云里霧里, 所以這就是我寫通俗易懂版的初衷! 但是既然是通俗易懂版就必然有缺陷, 只為了各位在開發過程中頭腦更加清晰, 如有錯誤還望兄弟們不吝賜教! 在MySQL數據庫中,事務一共有4…

C語言之strcmp函數,strlen函數

strcmp函數是比較兩個字符串ASCII大小的函數。 比較方式是自左向右比較&#xff0c;直到出現不同字符或者\0為止 語法格式 strcmp(字符串1,字符串2&#xff09; 如果兩個字符串相同&#xff0c;會返回數值0 如果字符串1>字符串2,會返回一個正數 如果字符串1<字符串2…

新一代電話機器人開源PHP源代碼

使用easyswoole 框架開發的 新一代電話機器人開源PHP源碼 項目地址&#xff1a;https://gitee.com/ddrjcode/robotphp 代理商頁面演示地址 http://119.23.229.15:8080 用戶名&#xff1a;c0508 密碼&#xff1a;123456 包含 AI外呼管理&#xff0c;話術管理&#xff0c;CR…

每日一題 — 復寫零

1089. 復寫零 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 首先找到最后一個復寫的數&#xff1a; 雙指針算法&#xff1a; 1、先判斷 cur 位置上的值 2、然后決定 dest 移動一步還是兩步 3、然后判斷 dest 是否到終點了 4、最后 cur 處理越界的情況 arr[n-1] …

使用sourceCompatibility = 11不匹配解決方法

運行springbootgradle項目報錯。 原因&#xff1a;在生產該項目時&#xff0c;選擇的JDK是11版本的&#xff0c;但是本地電腦只安裝了1.8版本。不兼容所以報錯。 解決辦法&#xff1a; 找到build.gradle配置文件—>找到sourceCompatibility ‘11’—>把11改成自己本地…

思維題(藍橋杯 填空題 C++)

目錄 題目一&#xff1a; ?編輯 代碼&#xff1a; 題目二&#xff1a; 代碼&#xff1a; 題目三&#xff1a; 代碼&#xff1a; 題目四&#xff1a; 代碼&#xff1a; 題目五&#xff1a; 代碼&#xff1a; 題目六&#xff1a; 代碼七&#xff1a; 題目八&#x…

用python和pygame庫實現刮刮樂游戲

用python和pygame庫實現刮刮樂游戲 首先&#xff0c;確保你已經安裝了pygame庫。如果沒有安裝&#xff0c;可以通過以下命令安裝&#xff1a; pip install pygame 示例有兩個。 一、簡單刮刮樂游戲 準備兩張圖片&#xff0c;一張作為背景bottom_image.png&#xff0c;一張作…

Leetcoder Day35| 動態規劃part02

62.不同路徑 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&#xff…

如何在Linux配置C、C++、Go語言的編譯環境?

在 Linux 系統上配置 C、C、Go 語言的編譯環境可以通過安裝相應的編譯器和相關工具來實現。以下是在 Linux 系統上配置這些語言的編譯環境的一般步驟&#xff1a; 1. C 和 C 編譯環境配置&#xff1a; 安裝 GCC 編譯器&#xff08;一般 Linux 發行版都會包含&#xff09;&…

Android 顯示系統框架

一.FrameBuffer FrameBuffer 介紹&#xff1a; FrameBuffer中文譯名為幀緩沖驅動&#xff0c;它是出現在2.2.xx內核中的一種驅動程序接口。主設備號為29&#xff0c;次設備號遞增。 Linux抽象出FrameBuffer這個設備來供用戶態進程實現直接寫屏。FrameBuffer機制模仿顯卡的功能…

Day11:信息打點-Web應用企業產權指紋識別域名資產網絡空間威脅情報

目錄 Web信息收集工具 業務資產-應用類型分類 Web單域名獲取-接口查詢 Web子域名獲取-解析枚舉 Web架構資產-平臺指紋識別 思維導圖 章節知識點&#xff1a; Web&#xff1a;語言/CMS/中間件/數據庫/系統/WAF等 系統&#xff1a;操作系統/端口服務/網絡環境/防火墻等 應用…

dart中的事件隊列與微任務

dart在每個事件循環中&#xff0c;會先執行同步任務代碼&#xff0c;然后分別檢查兩個任務隊列&#xff1a;微任務隊列和事件隊列。dart總是先執行微任務隊列中的代碼&#xff0c;然后才是事件隊列中的代碼。當兩個隊列中的任務都執行完成后&#xff0c;線程進入休眠狀態&#…

Stable Diffusion WebUI API http://127.0.0.1:7860/docs空白

在嘗試調用Stable Diffusion WebUI API的時候&#xff0c;打開http://127.0.0.1:7860/docs遇到了以下頁面 網絡診斷是這樣的原因&#xff1a; 修bug&#xff0c;改來改去遇到了以下兩種頁面&#xff1a; 此時http://127.0.0.1:7860可以如下正常顯示&#xff1a; 查資料的時候找…