LeetCode百題刷003(449周賽一二題)

遇到的問題都有解決的方案,希望我的博客可以為你提供一些幫助

一、不同字符數量最多為 K 時的最少刪除數 (哈希表空間換時間)

不同字符數量最多為 K 時的最少刪除數 - 力扣 (LeetCode) 競賽https://leetcode.cn/contest/weekly-contest-449/problems/minimum-deletions-for-at-most-k-distinct-characters/

思路分析:

  • 題干要求是刪除最少的元素以保證剩下的字符串中最多有k種不同的元素(每種元素可以有重復的)并返回刪除的元素的個數

問題分解:

  • 問題一:如何去確定要刪除哪些元素?
  • 問題二:如何去確定重復種類元素的個數呢?
  • 問題三:如何保證最多有k種元素呢?

針對問題一,我們需要保證刪除最少的元素,如果需要刪除某些種類元素,首先被刪除的元素種類一定是出現次數最少的而不是較多的。那么,我們需要先知道每一種元素出現的次數;其次,如果需要刪除某些種類的元素需要逐次刪除出現次數最小的。

針對問題二,可以看成一個經典的問題:如何在一個無序序列中統計每一個元素的頻率。即構建如下的映射結構?元素:出現次數,可以采用哈希表來解決。

針對問題三,將問題二中的哈希表的大小與k進行比較即可。

問題解決:

數據結構:哈希表

算法設計:

  • 利用哈希表統計每個元素的出現次數
  • 按出現次數升序排序
  • 比較k與哈希表的大小l?
  • 如果l<=k 直接返回 0
  • 如果l>k? ?不斷移除排序后序列的隊首(實際上是不斷累加首位元素出現的次數),直到l=k,返回累加結果

時間復雜度:O(nlogn)

空間復雜度:?O(n)

編碼實現(python):

class Solution:def minDeletion(self, s: str, k: int) -> int:#記錄元素出現次數的哈希表char_count={}for char in s:char_count[char]=char_count.get(char,0)+1#排序sorted_c=sorted(char_count.items(),key=lambda item : item[1])if len(sorted_c)>k:return sum([x[1] for x in  sorted_c[:len(sorted_c)-k]])else:return 0

提交結果(python):?

?編碼實現(c++):

class Solution {
public:int minDeletion(string s, int k) {//哈希表:記錄每種元素出現次數unordered_map<char,int> char_count;for(auto c :s){char_count[c]++;}// 將哈希表元素存入 vectorvector<pair<char,int>> sorted_c(char_count.begin(),char_count.end());// 按值升序排序sort(sorted_c.begin(),sorted_c.end(),[](const auto &a,const auto &b){return a.second<b.second;});//計算結果if (sorted_c.size()>k){return accumulate(sorted_c.begin(),sorted_c.end()-k,0,[](int count,const auto &b){return count+b.second;} );}else{return 0;}}
};

提交結果(c++):?

二、等和矩陣分割 I

等和矩陣分割 I - 力扣 (LeetCode) 競賽https://leetcode.cn/contest/weekly-contest-449/problems/equal-sum-grid-partition-i/

思路分析(這是我當時先想到的一個思路):

題干要求是進行一次水平或者垂直劃分,使劃分后的二維數組的兩部分(非空)的和相等。如果相等返回True,否則返回False

問題分解:

  • 問題一:水平或者垂直劃分如何實現?
  • 問題二:如何對劃分后的部分進行比較?
  • 問題三:如何判斷最終的返回結果?

針對問題一:二維數組有行和列,將每一行看成一個整體,對行操作就是實現水平劃分;同理對列操作就是垂直劃分

針對問題二和三: 題干要求劃分后兩部分需要相等,直接比較兩部分會比較困難因為我們不知道需要在哪一行或者那一列進行劃分,如果枚舉出所有可能再篩選時間耗費巨大,這時候不妨思考反面,我可不可以先求出總和(遍歷二維數組一次),再按行為單位或者列為單位去遍歷二維數組并記錄累加和,如果當前累加和等于總和的一半說明劃分正確否則不正確。

問題解決:

數據結構:二維數組

算法設計:

  • 遍歷數組計算總和
  • 按行為單位或者列為單位去遍歷二維數組并記錄累加和
  • 比較當前累加和與總和1/2的大小,如果等于則返回True否則返回False?

時間復雜度:O(n*m)

空間復雜度:?O(n)

?編碼實現(python):

class Solution:def canPartitionGrid(self, grid: List[List[int]]) -> bool:#計算二維數組總和sum_g=0for row in grid:sum_g+=sum(row)if sum_g%2!=0:return False#按行劃分sum_r=0;for row in grid:sum_r+=sum(row)if sum_r== sum_g/2:return Trueif sum_r>sum_g/2:#剪枝break#按列劃分sum_c=0list_c=[sum(row[i] for row in grid) for i in range(len(grid[0]))]for c in list_c:sum_c+=cif sum_c==sum_g/2:return Trueif sum_c>sum_g/2:breakreturn False

提交結果(python):?

?編碼實現(c++):

class Solution {
public:bool canPartitionGrid(vector<vector<int>>& grid) {//求總和long long  sum_g=0;for (auto row:grid){sum_g+=accumulate(row.begin(),row.end(),0LL);}// cout<<sum_g<<endl;//剪枝if (sum_g%2!=0){return false;}//行劃分long long sum_r=0;for (auto row:grid){sum_r+=accumulate(row.begin(),row.end(),0LL);cout<<sum_r<<endl;if(sum_r==sum_g/2)return true;if (sum_r>sum_g/2)break;}//列劃分long long   sum_c=0;for(int i=0;i<grid[0].size();i++){for(int j=0;j<grid.size();j++)sum_c+=grid[j][i];// cout<<sum_c<<endl;if (sum_c==sum_g/2)return true;if (sum_c>sum_g/2)break;}return false;}
};

提交結果(c++):?

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

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

相關文章

【網安等保】OpenEuler 24.03系統主機安全加固及配置優化實踐指南

[ 知識是人生的燈塔&#xff0c;只有不斷學習&#xff0c;才能照亮前行的道路 ] &#x1f4e2; 大家好&#xff0c;我是 WeiyiGeek&#xff0c;一個正在向全棧工程師(SecDevOps)前進的計算機技術愛好者&#xff0c;歡迎各位道友一起學習交流、一起進步 &#x1f680;&#xff0…

大模型賦能:2D 寫實數字人開啟實時交互新時代

在數字化浪潮席卷全球的當下&#xff0c;人工智能技術不斷突破創新&#xff0c;其中大模型驅動的 2D 寫實數字人正成為實時交互領域的一顆新星&#xff0c;引領著行業變革&#xff0c;為人們帶來前所未有的交互體驗。 一、2D 寫實數字人概述 2D 寫實數字人是通過計算機圖形學…

Dockers部署oscarfonts/geoserver鏡像的Geoserver

Dockers部署oscarfonts/geoserver鏡像的Geoserver 說實話&#xff0c;最后發現要選擇合適的Geoserver鏡像才是關鍵&#xff0c;所以所以所以…&#x1f437; 推薦oscarfonts/geoserver的鏡像&#xff01; 一開始用kartoza/geoserver鏡像一直提示內存不足&#xff0c;不過還好…

關于解決MySQL的常見問題

一&#xff1a;MySQL輸入密碼時閃退 這有可能是因為MySQL服務沒有開啟。 打開系統配置&#xff08;直接搜索即可&#xff09;&#xff0c;查看MySQL服務是否開啟。 此時顯示的是已停止。確定是這個問題。 現在打開計算機管理&#xff08;直接搜索即可&#xff09;。 找到MyS…

LeetCode 熱題 100 101. 對稱二叉樹

LeetCode 熱題 100 | 101. 對稱二叉樹 大家好&#xff0c;今天我們來解決一道經典的二叉樹問題——對稱二叉樹。這道題在 LeetCode 上被標記為簡單難度&#xff0c;要求檢查給定的二叉樹是否軸對稱。 問題描述 給你一個二叉樹的根節點 root&#xff0c;檢查它是否軸對稱。 示…

圖形化編程革命:iVX攜手AI 原生開發范式

一、技術核心&#xff1a;圖形化編程的底層架構解析 1. 圖形化開發的效率優勢&#xff1a;代碼量減少 72% 的秘密 傳統文本編程存在顯著的信息密度瓶頸。以 "按鈕點擊→條件判斷→調用接口→彈窗反饋" 流程為例&#xff0c;Python 實現需定義函數、處理縮進并編寫 …

uniapp跨平臺開發HarmonyOS NEXT應用初體驗

之前寫過使用uniapp開發鴻蒙應用的教程&#xff0c;簡單介紹了如何配置開發環境和運行項目。那時候的HbuilderX還是4.22版本&#xff0c;小一年過去了HbuilderX的正式版本已經來到4.64&#xff0c;歷經了多個版本的更新后&#xff0c;跨平臺開發鴻蒙應用的體驗大幅提升。今天再…

windows怎么修改DNS

好的&#xff0c;在 Windows 操作系統中修改 DNS 設置有幾種方法&#xff0c;最常用的是通過“網絡和 Internet 設置”。以下是詳細步驟&#xff1a; 方法一&#xff1a;通過設置應用修改 DNS (適用于 Windows 10/11) 打開設置&#xff1a; 點擊屏幕左下角的 Windows 開始按鈕…

Java基本數據類型緩存池解析-源碼剖析

拋出問題&#xff1a;new Integer(18) 與 Integer.valueOf(18) 的區別是什么&#xff1f; new Integer(18) 每次都會新建一個對象;Integer.valueOf(18) 會使?用緩存池中的對象&#xff0c;多次調用只會取同?一個對象的引用 Integer x new Integer(18); Integer y new Int…

WORD壓縮兩個免費方法

日常辦公和學習中&#xff0c;Word文檔常常因為包含大量圖片、圖表或復雜格式而導致文件體積過大&#xff0c;帶來諸多不便&#xff0c;比如 郵件發送受限&#xff1a;許多郵箱附件限制在10-25MB&#xff0c;大文件無法直接發送 存儲空間占用&#xff1a;大量文檔占用硬盤或云…

羅技無線鼠標的配對方法

羅技鼠標的配對方法&#xff1a; 重新連接鼠標 請按照以下步驟將鼠標與 USB 接收器重新配對。 1.將USB接收器插入計算機。 2.將鼠標關閉電源。 3.按住并持續按住向右按鈕&#xff0c;直到操作結束。 4.切換鼠標電源。 5. 單擊一次左側按鈕。 6. 單擊一次中間按鈕。 7.全部松開&…

四、Hadoop 2.X vs 3.X:特性、架構與性能全解析

Hadoop 2.X 與 Hadoop 3.X 深度對比&#xff1a;版本特性、架構與性能剖析 在大數據處理的浪潮中&#xff0c;Hadoop 憑借其分布式存儲與計算的強大能力&#xff0c;成為了業界的核心框架之一。隨著技術的不斷演進&#xff0c;Hadoop 也經歷了多個重要版本的迭代。其中&#x…

【React中useReducer鉤子詳解】

useReducer 是 React 中用于管理復雜狀態邏輯的 Hook&#xff0c;它通過 集中式狀態更新邏輯 替代 useState&#xff0c;尤其適合處理多值關聯狀態或依賴前序狀態更新的場景。以下是其核心要點&#xff1a; 1. 核心概念 Reducer 模式&#xff1a;靈感來自 JavaScript 的 Array…

【C++】C++函數指針詳解與實用技巧

C函數指針詳解與實用技巧 在C中&#xff0c;**函數指針&#xff08;Function Pointer&#xff09;**是一種強大而靈活的工具&#xff0c;常用于回調機制、策略模式、事件處理等場景。本文將從概念、語法、常見用法到實戰示例&#xff0c;帶你全面掌握C函數指針。 &#x1f9e0…

【計算機視覺】基于深度學習的實時情緒檢測系統:emotion-detection項目深度解析

基于深度學習的實時情緒檢測系統&#xff1a;emotion-detection項目深度解析 1. 項目概述2. 技術原理與模型架構2.1 核心算法1) 數據預處理流程2) 改進型MobileNetV2 2.2 系統架構 3. 實戰部署指南3.1 環境配置3.2 數據集準備3.3 模型訓練3.4 實時推理 4. 常見問題與解決方案4.…

IC ATE集成電路測試學習——電流測試的原理和方法

電流測試 我們可以通過電流來判斷芯片的工作狀態時&#xff0c;首先先了解下芯片的電流是如何產生的。 靜態電流 理論上&#xff0c;CMOS結構的芯片靜態時幾乎不耗電 CMOS基本結構&#xff1a;Pmos Nmos 串聯當邏輯電平穩定時&#xff1a; ? 要么Pmos導通&#xff0c;Nmo…

stm32week15

stm32學習 十一.中斷 2.NVIC Nested vectored interrupt controller&#xff0c;嵌套向量中斷控制器&#xff0c;屬于內核(M3/4/7) 中斷向量表&#xff1a;定義一塊固定的內存&#xff0c;以4字節對齊&#xff0c;存放各個中斷服務函數程序的首地址&#xff0c;中斷向量表定…

list類的詳細講解

【本節目標】 1. list的介紹及使用 2. list的深度剖析及模擬實現 3. list與vector的對比 1. list的介紹及使用 1.1 list的介紹 1. list 是可以在常數范圍內在任意位置進行插入和刪除的序列式容器&#xff0c;并且該容器可以前后雙向迭代。 2. list 的底層是雙向鏈表結構&a…

第十節:圖像處理基礎-圖像算術運算 (加法、減法、混合)

引言 在計算機視覺領域,圖像算術運算是最基礎卻至關重要的核心技術。無論是實現簡單的圖片合成、開發智能監控系統,還是構建復雜的醫學影像分析工具,加減運算和混合操作都扮演著關鍵角色。OpenCV作為最流行的計算機視覺庫,提供了完善的圖像處理函數集。本文將深入解析三種…

【React 的useState鉤子詳解】

React 的 useState 鉤子詳解 useState 是 React 中最基礎且最常用的 Hook 之一&#xff0c;它允許你在函數組件中添加和管理狀態。 基本語法 const [state, setState] useState(initialState);initialState: 狀態的初始值&#xff0c;可以是任何 JavaScript 數據類型state:…