Leetcode 第 384 場周賽題解

Leetcode 第 384 場周賽題解

  • Leetcode 第 384 場周賽題解
    • 題目1:3033. 修改矩陣
      • 思路
      • 代碼
      • 復雜度分析
    • 題目2:3034. 匹配模式數組的子數組數目 I
      • 思路
      • 代碼
      • 復雜度分析
    • 題目3:3035. 回文字符串的最大數量
      • 思路
      • 代碼
      • 復雜度分析
    • 題目4:3036. 匹配模式數組的子數組數目 II
      • 思路
      • 代碼
      • 復雜度分析

Leetcode 第 384 場周賽題解

題目1:3033. 修改矩陣

思路

模擬。

代碼

/** @lc app=leetcode.cn id=3033 lang=cpp** [3033] 修改矩陣*/// @lc code=start
class Solution
{
public:vector<vector<int>> modifiedMatrix(vector<vector<int>> &matrix){if (matrix.empty())return {};int m = matrix.size(), n = m ? matrix[0].size() : 0;auto answer = matrix;for (int i = 0; i < m; i++)for (int j = 0; j < n; j++){// 每個值為 -1 的元素需要替換if (matrix[i][j] == -1){// 找到列最大值int col_max = -1;for (int k = 0; k < m; k++)col_max = max(col_max, matrix[k][j]);// 修改 answer 數組answer[i][j] = col_max;}}return answer;}
};
// @lc code=end

復雜度分析

時間復雜度:O(m2*n),其中 m 和 n 分別是矩陣 matrix 的行數和列數。

空間復雜度:O(m*n),其中 m 和 n 分別是矩陣 matrix 的行數和列數。

題目2:3034. 匹配模式數組的子數組數目 I

思路

暴力。

設數組 nums 的長度為 m,數組 pattern 的長度為 n。

遍歷數組 nums 的每個長度是 n+1 的子數組并計算子數組的模式,然后與數組 pattern 比較,如果相等則找到一個匹配模式數組的子數組。遍歷結束之后即可得到匹配模式數組的子數組數目。

代碼

/** @lc app=leetcode.cn id=3034 lang=cpp** [3034] 匹配模式數組的子數組數目 I*/// @lc code=start
class Solution
{
public:int countMatchingSubarrays(vector<int> &nums, vector<int> &pattern){// 特判if (nums.empty() || pattern.empty())return 0;if (nums.size() <= pattern.size())return 0;int count = 0;int m = nums.size(), n = pattern.size();for (int i = 0; i < m - n; i++){bool flag = true;for (int k = 0; k < n && flag; k++){int diff = nums[i + k + 1] - nums[i + k];int p = getPattern(diff);if (p != pattern[k])flag = false;}if (flag)count++;}return count;}// 輔函數 - 計算 patternint getPattern(int diff){if (diff == 0)return 0;return diff > 0 ? 1 : -1;}
};
// @lc code=end

復雜度分析

時間復雜度:O((m-n)*n),其中 m 為數組 nums 的長度,n 為數組 pattern 的長度。

空間復雜度:O(1)。

題目3:3035. 回文字符串的最大數量

思路

由于可以隨意交換字母,先把所有字母都取出來,然后考慮如何填入各個字符串。

如果一個奇數長度字符串最終是回文串,那么它正中間的那個字母填什么都可以。

既然如此,不妨先把左右的字母填了,最后在往正中間填入字母。

字符串越短,需要的字母越少。

所以按照字符串的長度從小到大填。

統計所有字符串的長度之和,減去出現次數為奇數的字母,即為可以往左右填入的字母個數 total。

把字符串按照長度從小到大排序,然后遍歷。注意長為奇數的字符串,由于不考慮正中間的字母,其長度要減一。

代碼

/** @lc app=leetcode.cn id=3035 lang=cpp** [3035] 回文字符串的最大數量*/// @lc code=start
class Solution
{
public:int maxPalindromesAfterOperations(vector<string> &words){// 特判if (words.empty())return 0;int n = words.size();int total = 0; // 出現次數為偶數的字母總數unordered_map<char, int> mp;for (string &word : words){total += word.length();for (char &c : word)mp[c]++;}// 減去出現次數為奇數的字母for (auto &[ch, cnt] : mp)total -= cnt % 2;sort(words.begin(), words.end(), [](const string &s1, const string &s2){ return s1.length() < s2.length(); });int ans = 0;for (string &word : words){int len = word.length();// 長為奇數的字符串,長度要減一total -= len % 2 == 1 ? len - 1 : len;if (total < 0)break;ans++;}return ans;}
};
// @lc code=end

哈希表可以用位運算優化,詳見:【靈茶山艾府】兩種方法:正向思維 / 逆向思維(Python/Java/C++/Go)

復雜度分析

時間復雜度:O(L+nlogn),其中 n 是數組 words 的長度,L 是數組 words 中字符串的總長度。

空間復雜度:O(|∑|),其中 ∑ 是字符集,|∑| 為字符集的大小,因為 words[i] 僅由小寫英文字母組成,所以 |∑|=26。

題目4:3036. 匹配模式數組的子數組數目 II

思路

設數組 nums 的長度為 m,數組 pattern 的長度為 n。

遍歷數組 nums 的每個長度是 n+1 的子數組并計算子數組的模式,然后與數組 pattern 比較,如果相等則找到一個匹配模式數組的子數組。遍歷結束之后即可得到匹配模式數組的子數組數目。

我們發現這其實就是 KMP。

將匹配模式轉換成字符串:1 對應 ‘a’,0 對應 ‘b’,-1 對應 ‘c’。

代碼

/** @lc app=leetcode.cn id=3036 lang=cpp** [3036] 匹配模式數組的子數組數目 II*/// @lc code=start// KMPclass Solution
{
private:// KMP 算法vector<int> getNxt(string &pattern){vector<int> nxt;// next[0] 必然是 0nxt.push_back(0);// 從 next[1] 開始求int x = 1, now = 0;while (x < pattern.length()){if (pattern[now] == pattern[x]){// 如果 pattern[now] == pattern[x],向右拓展一位now++;x++;nxt.push_back(now);}else if (now != 0){// 縮小 now,改成 nxt[now - 1]now = nxt[now - 1];}else{// now 已經為 0,無法再縮小,故 next[x] = 0nxt.push_back(0);x++;}}return nxt;}vector<int> kmp(string &s, string &pattern){int m = pattern.length();vector<int> nxt = getNxt(pattern);vector<int> res;int tar = 0; // 主串中將要匹配的位置int pos = 0; // 模式串中將要匹配的位置while (tar < s.length()){if (s[tar] == pattern[pos]){// 若兩個字符相等,則 tar、pos 各進一步tar++;pos++;}else if (pos != 0){// 失配,如果 pos != 0,則依據 nxt 移動標尺pos = nxt[pos - 1];}else{// pos[0] 失配,標尺右移一位tar++;}if (pos == pattern.length()){res.push_back(tar - pos);pos = nxt[pos - 1];}}return res;}public:int countMatchingSubarrays(vector<int> &nums, vector<int> &pattern){// 特判if (nums.empty() || pattern.empty())return 0;if (nums.size() <= pattern.size())return 0;int count = 0;int m = nums.size(), n = pattern.size();// 1 對應 'a',0 對應 'b',-1 對應 'c'string s;for (int i = 0; i < m - 1; i++){int diff = nums[i + 1] - nums[i];int p = getPattern(diff);if (p == 1)s += "a";else if (p == 0)s += "b";elses += "c";}string p;for (int &pa : pattern){if (pa == 1)p += "a";else if (pa == 0)p += "b";elsep += "c";}return kmp(s, p).size();}// 輔函數 - 計算 patternint getPattern(int diff){if (diff == 0)return 0;return diff > 0 ? 1 : -1;}
};
// @lc code=end

復雜度分析

時間復雜度:O(m),其中 m 是數組 nums 的長度。

空間復雜度:O(n),其中 n 是數組 pattern 的長度。

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

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

相關文章

C語言標準庫介紹:<string.h>

在C語言中&#xff0c;<string.h>頭文件是標準庫中的一個重要部分&#xff0c;它定義了一系列操作字符串和字符數組的函數。本文將詳細介紹<string.h>頭文件中包含的22個函數&#xff0c;并提供每個函數的完整示例代碼。 簡介 <string.h>頭文件定義了一個變…

設計模式-工廠模式(Factory Pattern)

一、工廠模式說明 工廠模式是一種創建型設計模式&#xff0c;它提供了一種將對象的創建與使用分離的方式。工廠模式通過引入一個公共的接口來創建對象&#xff0c;而不是通過直接調用構造函數來創建對象。這樣做的好處是使得代碼更加靈活&#xff0c;更容易維護和擴展。 工廠模…

第3部分 原理篇2去中心化數字身份標識符(DID)(2)

3.2.2. DID相關概念 3.2.2.1. 去中心化標識符 (Decentralized identifier&#xff0c;DID) 本聰老師&#xff1a;DID有兩個含義&#xff0c;一是Decentralized identity&#xff0c;就是去中心化身份&#xff0c;是廣泛意義的DID。另外一個是Decentralized identifier&#xf…

Web性能優化-瀏覽器工作原理-MDN文檔學習筆記

瀏覽器工作原理 查看更多學習筆記&#xff1a;GitHub&#xff1a;LoveEmiliaForever MDN中文官網 導航 導航是加載 web 頁面的第一步&#xff1a;輸入 URL、點擊一個鏈接、提交表單等等 DNS查詢 導航的第一步是要去尋找頁面資源的位置 例如訪問https://example.com&#x…

如何解決DNS解析錯誤故障

DNS解析錯誤會導致將一個域名解析為錯誤的IP地址&#xff0c;或者根本無法確定某個域名對應的IP地址&#xff0c;從而無法通過域名訪問相應的站點&#xff0c;形成DNS解析故障。最常見的癥狀是訪問站點對應的IP地址沒有問題&#xff0c;但訪問其域名時卻出現錯誤。 DNS解析異常…

qt-動畫圓圈等待-LED數字

qt-動畫圓圈等待-LED數字 一、演示效果二、關鍵程序三、下載鏈接 一、演示效果 二、關鍵程序 #include "LedNumber.h" #include <QLabel>LEDNumber::LEDNumber(QWidget *parent) : QWidget(parent) {//設置默認寬高比setScale((float)0.6);//設置默認背景色se…

【深入了解TensorFlow】TensorFlow的安裝與配置

【深入了解TensorFlow】TensorFlow的安裝與配置 TensorFlow的安裝與配置準備就緒:開始前的準備工作1. 確定您的硬件和操作系統2. 選擇安裝方式3. 創建虛擬環境(可選)安裝TensorFlow使用pip安裝使用conda安裝從源代碼編譯安裝配置TensorFlow導入TensorFlow模塊檢查安裝是否成…

Oracle 表被刪除或重命名后賬戶間的授權與同義詞關系

Oracle 表被刪除或重命名后賬戶間的授權與同義詞關系 情景一、 當數據表刪除后 數據表被刪除后&#xff0c;同義詞還是存在的&#xff0c;可以查看當前用戶下查看同義詞&#xff1a; -- 查看當前用戶下的同義詞 select * from user_synonyms但授權關系不在了&#xff0c;若重…

10 個 Linux 中超方便的 Bash 別名

1、 你有幾次遇到需要解壓 .tar 文件但無法記住所需的確切參數&#xff1f;別名可以幫助你&#xff01;只需將以下內容添加到 .bash_profile 中&#xff0c;然后使用 untar FileName 解壓縮任何 .tar 文件。 alias untartar -zxvf 2、 下載文件時&#xff0c;如果出現問題想要…

websocket與Socket的區別

概念講解 網絡&#xff1a;通俗意義上&#xff0c;也就是連接兩臺計算器 五層網絡模型&#xff1a;應用層、傳輸層、網絡層、數據鏈路層、物理層 應用層 (application layer)&#xff1a;直接為應用進程提供服務。應用層協議定義的是應用進程間通訊和交互的規則&#xff0c;不…

明明正常,卻不停return

明明正常&#xff0c;卻不停return if(!is); { return ; } 熬人

應急響應速查

最重要的&#xff1a;我是誰&#xff1f;我在哪&#xff1f;別人怎么進來的&#xff1f;我就是這個被挖礦被勒索的電腦。 分析項 &#xff1a; 一、了解大概的被入侵系統情況&#xff1a; 發現時間&#xff1f;怎么發現的&#xff1f;這臺機器有沒有人運維&#xff1f;平時還…

排序第三篇 直接插入排序

插入排序的基本思想是&#xff1a; 每次將一個待排序的記錄按其關鍵字的大小插入到前面已排好序的文件中的適當位置&#xff0c; 直到全部記錄插入完為止。 一 簡介 插入排序可分為2類 本文介紹 直接插入排序 它的基本操作是&#xff1a; 假設待排充序的記錄存儲在數組 R[1……

電路設計(27)——交通信號燈的multisim仿真

1.功能要求 使用數字芯片設計一款交通信號燈&#xff0c;使得&#xff1a; 主干道的綠燈時間為60S&#xff0c;紅燈時間為45S 次干道的紅燈時間為60S&#xff0c;綠燈時間為45S 主、次干道&#xff0c;綠燈的最后5S內&#xff0c;黃燈閃爍 使用數碼管顯示各自的倒計時時間。 按…

JavaScript 數組、遍歷

數組 多維數組&#xff1a;數組里面嵌套 一層數組為二維數組。一維數組的使用頻率是最高的。 如果數組訪問越界會返回undefined。 數組遍歷 數組方法Array.isArray() 這個方法可以去判定一個內容是否是數組。

AndroidStudio 2024-2-21 Win10/11最新安裝配置(Kotlin快速構建配置,gradle鏡像源)

AndroidStudio 2024 Win10/11最新安裝配置 教程目的&#xff1a; (從安裝到卸載) &#xff0c;針對Kotlin開發配置&#xff0c;gradle-8.2-src/bin下載慢&#xff0c;以及Kotlin構建慢的解決 好久沒玩AS了,下載發現裝個AS很麻煩,就覺得有必要出個教程了(就是記錄一下:嘻嘻) 因…

把一個對象變成可迭代對象的兩種方法,使用Symbol.iterator 和生成器Generator

方法一&#xff1a;自定義Symbol.iterator屬性 如果對象擁有[Symbol.iterator] 方法&#xff0c;改方法返回一個迭代器對象&#xff0c;就可以稱之為可迭代對象&#xff0c;注意迭代器是一個有 next 方法的對象 步驟如下 實現一個Symbol.iterator 鍵值是一個函數&#xff0c;…

java 時間格式 YYYY 于yyyy的區別

java formatDate 時間時&#xff0c;經常需要輸入格式比如 YYYYMMDD,yyyyMMdd 這兩個是有區別的 具體每個參數可以看下面

igolang學習1,dea的golang-1.22.0

參考&#xff1a;使用IDEA配置GO的開發環境備忘錄-CSDN博客 1.下載All releases - The Go Programming Language (google.cn) 2.直接next 3.window環境變量配置 4.idea的go插件安裝 5.新建go項目找不到jdk解決 https://blog.csdn.net/ouyang111222/article/details/1361657…

代碼隨想錄算法訓練營第40天| 343. 整數拆分、96.不同的二叉搜索樹

343. 整數拆分 完成 思路&#xff1a; dp數組存放正整數i拆分后的乘積最大值&#xff1b;i可以拆分為j和i-j&#xff0c;也可以是j和dp[i-j]。 代碼 class Solution {public int integerBreak(int n) {int[] dp new int[n1];dp[2] 1;// 推導i的拆分乘積最大值for (int i …