leetcode 第 216 場周賽 整理

目錄

  • 1662. 檢查兩個字符串數組是否相等
    • 題目
    • 自己代碼
  • 5606. 具有給定數值的最小字符串
    • 題目
    • 自己代碼
    • 貪心算法
  • 1664. 生成平衡數組的方案數
    • 題目
    • 自己代碼
    • 動態規劃優化
  • 1665. 完成所有任務的最少初始能量
    • 題目
    • 思路

1662. 檢查兩個字符串數組是否相等

題目

給你兩個字符串數組 word1 和 word2 。如果兩個數組表示的字符串相同,返回 true ;否則,返回 false 。

數組表示的字符串 是由數組中的所有元素 按順序 連接形成的字符串。
在這里插入圖片描述

自己代碼

累加,然后判斷是否相等

class Solution {
public:bool arrayStringsAreEqual(vector<string>& word1, vector<string>& word2) {string str1="";string str2="";for(int i=0;i<word1.size();i++){str1+=word1[i];}for(int i=0;i<word2.size();i++){str2+=word2[i];}if(str1==str2) return true;else return false;}
};

5606. 具有給定數值的最小字符串

題目

小寫字符 的 數值 是它在字母表中的位置(從 1 開始),因此 a 的數值為 1 ,b 的數值為 2 ,c 的數值為 3 ,以此類推。

字符串由若干小寫字符組成,字符串的數值 為各字符的數值之和。例如,字符串 “abe” 的數值等于 1 + 2 + 5 = 8 。

給你兩個整數 n 和 k 。返回 長度 等于 n 且 數值 等于 k 的 字典序最小 的字符串。
在這里插入圖片描述
在這里插入圖片描述

自己代碼

記錄一下自己超時的代碼:
使用的回溯法,這一題使用回溯法并不好,字母越多,解空間樹就會越大,并且沒有使用高效的剪枝手段。
在這里插入圖片描述

class Solution {
public:int sum;int num;string res;char zimu[27]={'a','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};bool backtracking(int n,int k){if(num > n || sum > k || (num<n && sum<k && 26*(n-num)<(k-sum))){return false;}//找到了n個數if(num == n && sum == k){return true;}for(int i=1;i<=26;i++){//處理結點;string new_res = res;res+=(zimu[i]);sum+=i;num+=1;//遞歸,探索下一層if(backtracking(n,k)==true) return true;		sum-=i;num-=1;//回溯,撤銷處理結果res=new_res;}return false;}string getSmallestString(int n, int k) {res="";sum=0;num=0;backtracking(n,k);return res;}
};

貪心算法

構造出的字符串字典序最小,可以考慮貪心地從字符串的開頭處開始構造,每次選擇一個滿足要求的最小字母。
假設我們當前構造到了某一個位置,包括此位置還剩下n’個位子沒有放入字符,并且這些位子的數值之和為k’;
那么如果我們放入字母c,那么剩余n’-1個位置以及k’-c的數值和必須滿足:
n’-1<=k’-c<=26(n’-1)
(位置數 <= 位置數上的數值和 <= 位置數能放的最多的數值和);
這樣就能得到c的取值范圍:
k’ - 26(n’-1) <= c <= k’ - (n’-1)
這樣就能得到c的取值下限k’ - 26(n’-1);
如果下限小于等于0,我們取a(這是我們能取的當中最小的)
如果下限大于0,那么選擇數值對應的字符。
總的來說,就是從第一位到最后一位都取當前能夠取的最小值,這樣就能保證構造出來的字符串字典序最小了。

class Solution {
public:string getSmallestString(int n, int k) {int post_unused=n;int sum_left=k;string result="";while(post_unused!=0){int c=1;if(sum_left - 26*(post_unused-1)<=0)    c=1;else    c=sum_left - 26*(post_unused-1);result+=c-1+'a';post_unused--;sum_left-=c;}return result;}
};

按照這個思路寫一遍。
我他媽傻了,貪心也太牛了,學習了。
在這里插入圖片描述

1664. 生成平衡數組的方案數

題目

給你一個整數數組 nums 。你需要選擇 恰好 一個下標(下標從 0 開始)并刪除對應的元素。請注意剩下元素的下標可能會因為刪除操作而發生改變。

比方說,如果 nums = [6,1,7,4,1] ,那么:

選擇刪除下標 1 ,剩下的數組為 nums = [6,7,4,1] 。
選擇刪除下標 2 ,剩下的數組為 nums = [6,1,4,1]。
選擇刪除下標 4 ,剩下的數組為 nums = [6,1,7,4] 。
如果一個數組滿足奇數下標元素的和與偶數下標元素的和相等,該數組就是一個 平衡數組 。

請你返回刪除操作后,剩下的數組 nums 是 平衡數組 的 方案數 。
在這里插入圖片描述

自己代碼

又是一個超時代碼
在這里插入圖片描述
先講講思路:
首先nums數組中的每個位置都定義四個相應數組:
分別用來記錄i之前的偶數之和,i之前的奇數之和,i之后的偶數之和,i之后的奇數之和。
然后開始遍歷這個數組,記錄每個位子的四個數組數值。
去除索引為i的元素后,i之前元素的奇偶性不變,i之后元素的奇偶性改變,即i之后奇/偶數下標元素的和變成了偶/奇數下標。
然后暴力解:滿足奇數下標元素的和與偶數下標元素的和相等

class Solution {
public:int waysToMakeFair(vector<int>& nums) {int fangannums=0;for(int i=0;i<nums.size();i++){vector<int> sum={0,0,0,0};for(int j=0;j<i;j+=2){sum[0]+=nums[j];}for(int j=1;j<i;j+=2){sum[1]+=nums[j];}if(i%2==0){for(int j=i+1;j<nums.size();j+=2){sum[2]+=nums[j];}for(int j=i+2;j<nums.size();j+=2){sum[3]+=nums[j];} }else{for(int j=i+1;j<nums.size();j+=2){sum[3]+=nums[j];}for(int j=i+2;j<nums.size();j+=2){sum[2]+=nums[j];} }if(sum[0]+sum[2] == sum[1]+sum[3]) fangannums+=1;}return fangannums;}
};

動態規劃優化

之前超時很明顯就是四個數組值重復計算:i之前的偶數之和,i之前的奇數之和,i之后的偶數之和,i之后的奇數之和。
現在直接看下標,這樣不容易混淆,下標是偶數,數組名字中就有even,下標是奇數,名字中就有odd。
步驟如下:
在這里插入圖片描述

在這里插入圖片描述
需要特別注意的地方:
dp推導:
注意這里我們四個數組都不會將nums[i]包括進去的。
i為偶數的話,i-1是奇數,所以左偶和[i] = 左偶和[i-1],左奇和[i] = 左奇和[i-1]+nums[i-1];
i為奇數的話,i-1是偶數,所以左偶和[i] = 左偶和[i-1]+nums[i-1],左奇和[i] = 左奇和[i-1];
這樣一來,就能對計算i之前的偶數和,奇數和省下時序。沒必要每次都從i=0開始判斷累加。
其次,i右邊的偶數和,奇數和也沒必要通過for運算開始計算,而是只需要從sum_odd和sum_even中視情況減去左偶右偶、nums[i]即可。
這樣也是同時省下大把時序。

//如果i是偶數下標,i-1為奇數下標
if(i%2==0)  
{before_i_evensum[i]=before_i_evensum[i-1];before_i_oddsum[i]=before_i_oddsum[i-1]+nums[i-1];
}
else
{before_i_evensum[i]=before_i_evensum[i-1]+nums[i-1];before_i_oddsum[i]=before_i_oddsum[i-1];
}
class Solution {
public:int waysToMakeFair(vector<int>& nums) {int fangannums=0;int n = nums.size();//i左邊偶數下標所指數之和vector<int> before_i_evensum(n,0);//i左邊奇數下標所指數之和vector<int> before_i_oddsum(n,0);//i右邊偶數下標所指數之和vector<int> after_i_evensum(n,0);//i右邊偶數下標所指數之和vector<int> after_i_oddsum(n,0);//*******【1】計算數組的奇數下標和以及偶數下標和***//int sum_odd=0;int sum_even=0;for(int i=0;i<n;i++){if(i%2==0) sum_even+=nums[i];else sum_odd+=nums[i];}//****************************************//for(int i=0;i<n;i++){if(i==0){after_i_evensum[0]=sum_even - nums[i];after_i_oddsum[0] = sum_odd; }else{//*******【2】i之前的偶數下標和以及奇數下標和***////如果i是偶數下標,i-1為奇數下標if(i%2==0)  {before_i_evensum[i]=before_i_evensum[i-1];before_i_oddsum[i]=before_i_oddsum[i-1]+nums[i-1];after_i_evensum[i]=sum_even - before_i_evensum[i] - nums[i];after_i_oddsum[i] = sum_odd - before_i_oddsum[i];}//如果i是奇數下標,i-1為偶數下標else{before_i_evensum[i]=before_i_evensum[i-1]+nums[i-1];before_i_oddsum[i]=before_i_oddsum[i-1];after_i_evensum[i]=sum_even - before_i_evensum[i];after_i_oddsum[i] = sum_odd - before_i_oddsum[i] - nums[i];}}if(before_i_evensum[i]+after_i_oddsum[i] == before_i_oddsum[i]+after_i_evensum[i])fangannums++;    }return fangannums;}
};

在這里插入圖片描述
這一題當時并沒有做出來,是剛剛才想到的。

1665. 完成所有任務的最少初始能量

題目

給你一個任務數組 tasks ,其中 tasks[i] = [actuali, minimumi] :

actuali 是完成第 i 個任務 需要耗費 的實際能量。
minimumi 是開始第 i 個任務前需要達到的最低能量。
比方說,如果任務為 [10, 12] 且你當前的能量為 11 ,那么你不能開始這個任務。如果你當前的能量為 13 ,你可以完成這個任務,且完成它后剩余能量為 3 。

你可以按照 任意順序 完成任務。

請你返回完成所有任務的 最少 初始能量。

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

思路

觀察示例,可以發現,完成的任務是按照最(低能量-實際能量)的大小來排序的,差越大的越先被執行。
https://leetcode-cn.com/problems/minimum-initial-energy-to-finish-tasks/solution/wan-cheng-suo-you-ren-wu-de-zui-shao-chu-shi-neng-/
神仙題目,這里貼個代碼:

class Solution {
public:static bool cmp(vector<int>& p1, vector<int>& p2) {return p1[1] - p1[0] > p2[1] - p2[0];}int minimumEffort(vector<vector<int>>& tasks) {sort(tasks.begin(), tasks.end(),cmp);int sum=0;  //完成任務需要消耗的實際能量int ans=0;  //完成任務需要達到的最低能量//打印信息// for(auto& task : tasks)// {//     cout<<"task[0]:"<<task[0]<<" task[1]:"<<task[1]<<endl;// }for(auto& task : tasks){//cout<<"ans:"<<ans<<" sum:"<<sum<<endl;ans = max(ans,sum+task[1]);sum +=task[0];}return ans;}
};

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

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

相關文章

九、忘記密碼功能的實現

一、頁面設計 login頁面&#xff0c;和第二篇博文(用戶登錄和注冊)頁面基本一樣&#xff0c;只不過多了一個按鈕 其中忘記密碼&#xff1f;點我找回 為button3 retrieve_password頁面 change_password頁面 頁面如下&#xff1a; 二、數據庫 因為是忘記密碼&#xff0c;…

Android中對手機文件進行讀寫

參考張澤華視頻 &#xff08;一&#xff09;讀寫手機內存卡中的文件 對手機中的文件進行讀寫操作&#xff0c;或者新增一個文件時&#xff0c;可直接使用openFileOutput / openFileInput 得到文件的輸出、輸入流。 FileOutputStream fos this.openFileOutput("private.…

聯軸器選型_聯軸器| 軟件工程

聯軸器選型耦合 (Coupling) In general terms, the term coupling is defined as a thing that joins together two objects. If we talk about software development, then the term coupling is related to the connection between two modules, i.e. how tight interaction …

劍指 Offer 10- I. 斐波那契數列 (從重疊子問題到備忘錄到dp數組迭代解法)

目錄題目描述1、暴力遞歸法的重疊子問題2、備忘錄解法3、dp數組迭代算法4、滾動數組優化5、參考鏈接題目描述 寫一個函數&#xff0c;輸入 n &#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;數列的第 n 項。斐波那契數列的定義如下&#xff1a; F(0) 0, F(1) 1 F…

C# 收郵件

C#沒有內置收郵件的類&#xff0c;參考網絡上的代碼&#xff0c;針對POP3協議服務器使用 Jmail組件來收郵件&#xff0c;針對IMAP協議服務器使用LumiSoft.Net 。 另外&#xff0c;一般免費郵箱需要在郵箱設置中開啟 POP3&#xff08;或IMAP&#xff09;、 SMTP服務才可以使用非…

HDU- 1754 I Hate It

http://acm.hdu.edu.cn/showproblem.php?pid1754 記住那讓自己wa的地方。 I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 29300 Accepted Submission(s): 11615 Problem Description很多學校流行…

mcq 隊列_MCQ | 軟件生命周期模型

mcq 隊列Q1. Which of the following models is best suited when the requirements of the software are not decided and also the user is not sure about how he wants the user interface to look like? Q1。 當不確定軟件的需求并且用戶不確定自己希望用戶界面看起來如何…

十、紡織品庫存管理系統全部功能展示

一、系統主頁面—Form1 系統運行加載頁面&#xff0c;主要包含三個功能&#xff0c;①登錄、②注冊、③退出系統 程序運行圖&#xff1a; 登錄功能&#xff0c;跳轉到登錄頁面 注冊功能&#xff0c;跳轉到注冊頁面 退出系統&#xff0c;程序結束運行 代碼如下&#xff1a; …

leetcode 376. 擺動序列 思考分析

目錄題目思路分析代碼總結題目 如果連續數字之間的差嚴格地在正數和負數之間交替&#xff0c;則數字序列稱為擺動序列。第一個差&#xff08;如果存在的話&#xff09;可能是正數或負數。少于兩個元素的序列也是擺動序列。 例如&#xff0c; [1,7,4,9,2,5] 是一個擺動序列&am…

[EF在VS2010中應用Entity framework與MySQL

在VS2010中應用Entity framework與MySQL 羅朝輝 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商業用途-保持一致”創作公用協議本文講述了在VS2010中使用EF與MySQL的一個簡單示例。 工具安裝&#xff1a; 1&#xff0c;MySQL MySQL Community Server Connector/NET 6…

c++ cdi+示例_C ++“和”關鍵字示例

c cdi示例"and" is an inbuilt keyword that has been around since at least C98. It is an alternative to && (Logical AND) operator and it mostly uses with the conditions. “ and”是一個內置關鍵字&#xff0c;至少從C 98起就存在。 它是&&am…

Python上個手

Python&#xff0c;由吉多范羅蘇姆&#xff08;Guido van Rossum&#xff09;在1989打發圣誕節放假時間的一門“課余”編程項目&#xff0c;至今已有二十多年的歷史&#xff0c;語法簡潔清晰&#xff0c;深受喜愛&#xff1b; 小窺 # 查看版本 python -V # 輸出 print "he…

十、美化界面

一、背景圖片 二、透明化處理 BackColor—web—Transparent 三、數據庫建表語句 數據庫 USE [fiber_yy] GO /****** Object: Table [dbo].[yy_user_record] Script Date: 06/20/2022 18:54:48 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADD…

如何寫出優美的代碼(二)

&#xff08;本文思想基本來自于經典著作《重構》一書&#xff09; 上一篇 http://www.cnblogs.com/ceys/archive/2012/03/05/2379842.html#commentform 上一篇文章主要講了怎么給函數整容。現在我們大家基本上都使用面向對象語言&#xff0c;什么樣的“對象”才是優美的呢&…

轉:鏈表相交問題 詳解

源地址&#xff1a;http://blog.163.com/bbluesnow126/blog/static/27784545201251051156817/ 鏈表相交問題 2012-06-10 17:15:37| 分類&#xff1a; 算法 | 標簽&#xff1a;微軟面試題 |字號 訂閱 1、如何判斷一個單鏈表有環 2、如何判斷一個環的入口點在哪里 3、如何知…

VS 如何修改C++編譯標準

第一步&#xff0c;打開項目資源管理器的屬性頁面 第二步&#xff0c;選擇配置屬性->C/C>語言->C語言標準 第三步&#xff0c;選擇合適的標準&#xff0c;一般來說選最新即可

維吉尼亞密碼和一次性密碼本_密碼學中的一次性密碼

維吉尼亞密碼和一次性密碼本The One-time Pad cipher is almost similar to the Vernam cipher, as, like the vernam cipher, this cipher technique also encrypts the plain text by working on the binary level of the text. The only difference between the two is that…

十一、紡織面料下架功能的實現

一、數據庫 數據庫仍用yy_textile表&#xff0c;前幾篇博文都敘述過這里就不再敘述 在fiber_yy數據庫下創建yy_textile表 初始數據庫信息 二、頁面 admin_undercarriage 三、代碼實現 admin_undercarriage using System; using System.IO; using System.Data; using S…

svg和canvas的應用場景分析【轉載】

原文地址&#xff1a;http://blogs.msdn.com/b/weizhong/archive/2011/07/16/canvas-svg.aspx 思考什么時候使用Canvas 和SVG wzhong 15 Jul 2011 9:07 PM 0HTML5 Canvas 和 SVG 是 IE9 中引入的兩項令人激動的圖形功能。上周在拉斯維加斯舉辦的 MIX11 大會對這兩個功能進行了介…

【C++grammar】文件系統以及path類使用

目錄1.文件系統概述1、關于路徑2、如何將某個路徑下的所有文件遞歸地找出來&#xff1f;2.路徑類及操作1、path類的成員函數2、path類的非成員函數示例1&#xff1a;展示C17中的path對象的用法示例2&#xff1a;展示Path類中用于分解路徑成分的函數示例3&#xff1a;展示path相…