LeetCode,第377場周賽,個人題解

目錄

100148.最小數字游戲

題目描述

思路分析

代碼詳解

100169.移除柵欄得到的正方形田地的最大面積

題目描述

思路分析

代碼詳解

100156.轉換字符串的最小成本I

題目描述

思路分析

代碼詳解

100158.轉換字符串的最小成本II

題目描述

思路分析

代碼詳解


100148.最小數字游戲

題目描述

你有一個下標從?0?開始、長度為?偶數?的整數數組?nums?,同時還有一個空數組?arr?。Alice 和 Bob 決定玩一個游戲,游戲中每一輪 Alice 和 Bob 都會各自執行一次操作。游戲規則如下:

  • 每一輪,Alice 先從?nums?中移除一個?最小?元素,然后 Bob 執行同樣的操作。
  • 接著,Bob 會將移除的元素添加到數組?arr?中,然后 Alice 也執行同樣的操作。
  • 游戲持續進行,直到?nums?變為空。

返回結果數組?arr?。

思路分析

小根堆直接模擬

代碼詳解

class Solution {
public:vector<int> numberGame(vector<int>& nums) {priority_queue<int,vector<int>,greater<int>> pq{nums.begin() , nums.end()};vector<int> ret;int x , y;while(pq.size()){y = pq.top();pq.pop();x = pq.top() , pq.pop();ret.push_back(x);ret.push_back(y);}return ret;}
};

100169.移除柵欄得到的正方形田地的最大面積

題目描述

有一個大型的?(m - 1) x (n - 1)?矩形田地,其兩個對角分別是?(1, 1)?和?(m, n)?,田地內部有一些水平柵欄和垂直柵欄,分別由數組?hFences?和?vFences?給出。

水平柵欄為坐標?(hFences[i], 1)?到?(hFences[i], n),垂直柵欄為坐標?(1, vFences[i])?到?(m, vFences[i])?。

返回通過?移除?一些柵欄(可能不移除)所能形成的最大面積的?正方形?田地的面積,或者如果無法形成正方形田地則返回?-1

由于答案可能很大,所以請返回結果對?109 + 7?取余?后的值。

注意:田地外圍兩個水平柵欄(坐標?(1, 1)?到?(1, n)?和坐標?(m, 1)?到?(m, n)?)以及兩個垂直柵欄(坐標?(1, 1)?到?(m, 1)?和坐標?(1, n)?到?(m, n)?)所包圍。這些柵欄?不能?被移除。

思路分析

先對兩個方向柵欄進行排序,然后哈希表記錄所有水平可能間隔

枚舉垂直可能間隔,如果已經在哈希表存在,則為可能答案,維護答案的最大值即可

代碼詳解

class Solution
{
public:const int MOD = 1e9 + 7;int maximizeSquareArea(int m, int n, vector<int> &hFences, vector<int> &vFences){unordered_set<int> hash;hFences.emplace_back(m);vFences.emplace_back(n);sort(hFences.begin(),hFences.end());sort(vFences.begin(),vFences.end());int n1 = hFences.size(), n2 = vFences.size(), x, ans = 0;for (int i = 0; i < n1; i++){x = hFences[i];hash.insert(x - 1);for (int j = i - 1; j >= 0; j--)hash.insert(x - hFences[j]);}for (int i = 0; i < n2; i++){x = vFences[i];if (hash.count(x - 1))ans = max(ans, x - 1);for (int j = i - 1; j >= 0; j--)if (hash.count(x - vFences[j]))ans = max(ans, x - vFences[j]);}return ans ? (((long long)ans * ans) % MOD) : -1;}
};

100156.轉換字符串的最小成本I

題目描述

給你兩個下標從?0?開始的字符串?source?和?target?,它們的長度均為?n?并且由?小寫?英文字母組成。

另給你兩個下標從?0?開始的字符數組?original?和?changed?,以及一個整數數組?cost?,其中?cost[i]?代表將字符?original[i]?更改為字符?changed[i]?的成本。

你從字符串?source?開始。在一次操作中,如果?存在?任意?下標?j?滿足?cost[j] == z? 、original[j] == x?以及?changed[j] == y?。你就可以選擇字符串中的一個字符?x?并以?z?的成本將其更改為字符?y?。

返回將字符串?source?轉換為字符串?target?所需的?最小?成本。如果不可能完成轉換,則返回?-1?。

注意,可能存在下標?i?、j?使得?original[j] == original[i]?且?changed[j] == changed[i]?。

思路分析

可以直接轉換的字符之間可以建立一條有向邊,那么我們可以預處理一張有向圖,然后跑一邊floyd,比對原字符串和目標字符串,如果相同則不做處理

如果不同且有路,那么答案加上路徑長度

如果不同且沒路,那么就直接返回-1

代碼詳解

class Solution
{
public:long long minimumCost(string source, string target, vector<char> &original, vector<char> &changed, vector<int> &cost){long long ret = 0;int n = original.size();vector<vector<int>> minc(26 , vector<int>(26,INT_MAX));for (int i = 0; i < n; i++)minc[original[i] - 'a'][changed[i] - 'a'] = min(minc[original[i] - 'a'][changed[i] - 'a'],cost[i]);for (int k = 0; k < 26; k++)for (int i = 0; i < 26; i++)for (int j = 0; j < 26; j++)if (minc[i][j] - minc[i][k] > minc[k][j])minc[i][j] = minc[i][k] + minc[k][j];for (int i = 0, len = source.size(); i < len; i++)if (source[i] == target[i])continue;else{if (minc[source[i] - 'a'][target[i] - 'a'] == INT_MAX)return -1;ret += minc[source[i] - 'a'][target[i] - 'a'];}return ret;}
};

100158.轉換字符串的最小成本II
?

題目描述

給你兩個下標從?0?開始的字符串?source?和?target?,它們的長度均為?n?并且由?小寫?英文字母組成。

另給你兩個下標從?0?開始的字符串數組?original?和?changed?,以及一個整數數組?cost?,其中?cost[i]?代表將字符串?original[i]?更改為字符串?changed[i]?的成本。

你從字符串?source?開始。在一次操作中,如果?存在?任意?下標?j?滿足?cost[j] == z? 、original[j] == x?以及?changed[j] == y?,你就可以選擇字符串中的?子串?x?并以?z?的成本將其更改為?y?。 你可以執行?任意數量?的操作,但是任兩次操作必須滿足?以下兩個?條件?之一?:

  • 在兩次操作中選擇的子串分別是?source[a..b]?和?source[c..d]?,滿足?b < c???d < a?。換句話說,兩次操作中選擇的下標?不相交?
  • 在兩次操作中選擇的子串分別是?source[a..b]?和?source[c..d]?,滿足?a == c??b == d?。換句話說,兩次操作中選擇的下標?相同?

返回將字符串?source?轉換為字符串?target?所需的?最小?成本。如果不可能完成轉換,則返回?-1?。

注意,可能存在下標?i?、j?使得?original[j] == original[i]?且?changed[j] == changed[i]?。

思路分析

和上一道題類似的思路,上一題對字符建圖,這道題對字符串建圖

關鍵在于如何快速獲取字符串,可以選擇字符哈希,這里我用的字典樹,不過比賽的時候被卡常了,賽后加了個關閉輸入輸出同步然后過了

具體就是把可轉換字符串都插入到字典樹,對應單詞結尾的字典樹節點編號是可以作為字符串的映射的,為了跑floyd就把字典樹節點編號再離散化一下

這樣得到了最多200個節點的圖,完全可以跑floyd

然后對于熟悉這種字符串轉換的很容易想到動態規劃進一步處理

我們規定dp[i]為下標i 到 n - 1轉換成本

然后我們找從下標i開始的可轉換子串,結束下標為j,那么dp[i] = min(dp[i] , dp[j + 1] + dist[][])

那么如果source[i] == target[i] ,dp[i]初始化為dp[i + 1]

之所以倒序dp是因為用了字典樹存儲

代碼詳解

class Solution
{
public:Solution(){ios::sync_with_stdio(false);cin.tie(nullptr), cout.tie(nullptr);}int nodes[200010][26], id[200010] , idx;long long inf = 0x3f3f3f3f3f3f3f3f;int insert(const string &s){int cur = 0;for (char c : s){if (nodes[cur][c - 'a'] == -1)nodes[cur][c - 'a'] = idx++;cur = nodes[cur][c - 'a'];}return cur;};long long minimumCost(string source, string target, vector<string> &original, vector<string> &changed, vector<int> &cost){int n = original.size() * 2, x, y;long long d[n][n];memset(d, 0x3f, sizeof(d));memset(id, -1, sizeof(id));memset(nodes, -1, sizeof(nodes));idx = 1;int tot = 0;for (int i = 0; i < original.size(); ++i){x = insert(original[i]), y = insert(changed[i]);if(id[x] == -1) id[x] = tot++;if(id[y] == -1) id[y] = tot++;x = id[x] , y = id[y];d[x][y] = min(d[x][y], (long long)cost[i]);}for (int k = 0; k < tot; ++k)for (int i = 0; i < tot; ++i)for (int j = 0; j < tot; ++j)if (d[i][j] - d[i][k] > d[k][j])d[i][j] = min(d[i][j], d[i][k] + d[k][j]);n = source.size();vector<long long> dp(n + 1, inf);dp[n] = 0;for (int i = n - 1; i >= 0; i--){if (source[i] == target[i])dp[i] = dp[i+1];x = y = 0;for(int j = i ; j < n ; j++){x = nodes[x][source[j]-'a'],y = nodes[y][target[j]-'a'];if(y==-1||x==-1) break;if(id[x]==-1||id[y]==-1) continue;dp[i] = min(dp[i] , dp[j+1] + d[id[x]][id[y]]);}}return dp[0] == inf ? -1 : dp[0];}
};

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

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

相關文章

for each....in、for in、for of

一、一般的遍歷數組的方法: var array [1,2,3,4,5,6,7]; for (var i 0; i < array.length; i) { console.log(i,array[i]); } 二、用for in的方遍歷數組 for(let index in array) { console.log(index,array[index]); }; 三、forEach array.forEach(v>{ cons…

Vue cli3.0創建Vue項目

創建Vue項目 在要創建項目的文件夾下面打開Powershell窗口 輸入命令 vue create 項目名稱 選擇第二項 回車后 選擇是否使用歷史路由 no 回車 選擇 Less 回車 選擇第三個 回車 選擇第一個 回車 選擇第一個 回車 是否保存模板 選擇no 完成啦 完成

文件內容的輸出io

package bbb; import java.io.*; public class ccc {public static void main(String[]args) throws IOException{ File filenew File("d:/1data.txt"); FileOutputStream outnew FileOutputStream(file); byte buy[]"12345abcdef#%&*軟件工程".getByt…

看完后完全了解 Vue 2.0 和 Vue 3.0 的區別

1.數據的雙向綁定 Vue2.0使用Object.defineProperty 原理&#xff1a;通過使用 Object.defineProperty 來劫持對象屬性的 geter 和 seter 操作&#xff0c;當數據發生改變發出通知 代碼&#xff1a; 1 <!DOCTYPE html>2 <html lang"en">3 <head>4…

channels2.X 學習筆記

- No module named asgiref.sync 報錯解決&#xff1a; # 報錯原因&#xff1a; """ django版本過低&#xff0c; 卸載最新版本的 channels 使用2.x 版本的 """ pip3 uninstall channels - 安裝&#xff1a; """ Django 1.11.15 …

風格遷移學習筆記

風格遷移大作業 學習規劃 跑通一份代碼&#xff01;&#xff01;&#xff01;&#xff08;done&#xff09;對照代碼、Blog和論文理解相應的算法過程規劃下一步&#xff0c;修改代碼&#xff08;done&#xff09;&#xff0c;實現預計功能&#xff08;done&#xff09;調參&…

Netty源碼分析第5章(ByteBuf)----第5節: directArena分配緩沖區概述

Netty源碼分析第5章(ByteBuf)---->第5節: directArena分配緩沖區概述 Netty源碼分析第五章: ByteBuf 第五節: directArena分配緩沖區概述 上一小節簡單分析了PooledByteBufAllocator中, 線程局部緩存和arean的相關邏輯, 這一小節簡單分析下directArena分配緩沖區的相關過程 …

uni-app(從零開始)

uni-app&#xff08;從零開始&#xff09; uni-app 是什么&#xff1f; uniapp 就是使用Vue.js技術開發所有前端框架的跨端框架uniapp 就是可以將一套代碼 發布到多個平臺 uniapp 和 Vue 的關系&#xff1f; uniapp是基于vue進行開發&#xff0c;繼承了Vue的特性和語法在開…

Remote desktop manager共享賬號

因為多個遠程機器&#xff0c;是會用了域賬號進行登錄的。而域賬號的密碼&#xff0c;三個月之后&#xff0c;密碼強制過期 添加一個新的entry&#xff0c;類型是Credential Entry&#xff0c;然后選擇用戶名/密碼 在remote desktop編輯的頁面&#xff0c;Credentials選擇Crede…

bzoj4403:序列統計

我好傻啊 題目 先來看看長度只能為\(n\)的情況 那么答案非常顯然是\(\binom{mn-1}{n}\) 其中\(mR-L1\) 因為我們要構造一個非降序列&#xff0c;顯然可能一個數會被選擇多次&#xff0c;組合非常不好做&#xff0c;于是我們可以把每一個數的下標加上其對應的下標那么現在的值域…

Mui常用的方法

中對話框 語法&#xff1a;mui.confirm 用法 mui.confirm("確認要切換角色&#xff1f;", "提示", btnArray, function(e) {if(e.index 1) {} else {}});組件名作用alert警告框confirm確認框prompt輸入對話框toast消息提示框&#xff08;自動消失&#x…

sudo: pip:找不到命令

https://blog.csdn.net/fcku_88/article/details/84191288轉載于:https://www.cnblogs.com/xxswkl/p/11012709.html

java ListMapString,Object遍歷的方法

java List<Map<String,Object>遍歷的方法 public class Test {public static void main(String[] args) {List<Map<String, Object>> listMaps new ArrayList<Map<String, Object>>();Map<String, Object> map1 new HashMap<Strin…

vue如何更換網頁標簽的logo

Vue2 版本更換圖標 在我們項目的根目錄下面去添加或者替換 favicon.icon文件 找到我們的 build 文件夾下面的這兩個文件 進行如下配置 favicon: resolveApp(’./favicon.ico’) 刷新后發現并沒有什么效果 莫慌 最后一步 重啟項目 改變端口 如果重啟后還沒有起到作用的話就…

Java并發編程的藝術(十)——Java中的鎖(5)

1. LockSupport工具 1.1 LockSupport的作用 當需要阻塞或喚醒一個線程的時候&#xff0c;都會使用LockSupport工具類來完成相應工作。LockSupport定義了一組公共的靜態方法&#xff0c;這些方法提供了做基本的線程阻塞和喚醒功能。 1.2 LockSupport提供的阻塞和喚醒方法 方法描…

運動-模擬返回頂部

第一步&#xff1a;獲取底部的那個按鈕對象&#xff0c;默認的情況下那個按鈕對象是不可見的。可見的條件的是滾輪距離頂部有距離。 var oBtndocument.getElementById(btn1); 第二步&#xff1a;添加滾輪事件。 (1). 獲取滾輪距離頂部的距離。如果距離大于0&#xff0c;就將按鈕…

《JavaScript高級程序設計》筆記總結

在北京上班的我每天在上下班路上的時間總共是兩個半小時&#xff0c;為了充實這兩個多小時的時間&#xff0c;我便花了銀子換得了下面這個寶貝 本書內容&#xff08;引用書中前言&#xff09; 本書提供了JavaScript開發人員必須掌握的內容&#xff0c;全面涵蓋了JavaScript的…

Task執行多次

項目中&#xff0c;曾經出現過啟動時數據庫連接數瞬間增大&#xff0c;當時并沒有注意該問題。 后期&#xff0c;由于Task任務多次執行&#xff0c;才著手查看這個問題&#xff0c;經排查&#xff0c;由于tomcat中webapp配置多次&#xff0c;導致webapp被掃描多次&#xff08;配…

ES6 的新特性總結

ES6 的新特性總結 關于聲明變量 由 var 變成 let 和 const 區別&#xff1a; var聲明的變量會掛載到window上&#xff0c;let和const聲明的變量不會var聲明的變量存在變量提升&#xff0c;而let和const聲明的變量不存在變量提升let和const聲明的變量形成塊級作用域在同一作…

遞推(一):遞推法的基本思想

所謂遞推&#xff0c;是指從已知的初始條件出發&#xff0c;依據某種遞推關系&#xff0c;逐次推出所要求的各中間結果及最后結果。其中初始條件或是問題本身已經給定&#xff0c;或是通過對問題的分析與化簡后確定。 利用遞推算法求問題規模為n的解的基本思想是&#xff1a;當…