代碼隨想錄算法訓練營第三十五天|416. 分割等和子集、698.劃分為k個相等的子集、473.火柴拼正方形

今日題目

416. 分割等和子集

題目鏈接:416. 分割等和子集 - 力扣(LeetCode)

思考:本題要將數組分為兩個子數組,且兩個子數組和相等,因此首先可以想到的條件就是數組可分為兩個,這要求數組元素數量>1,要想兩個子數組和相等,則原始數組和為偶數才行。

處理完上述特殊條件后,需要考慮如何劃分數組。由于要把原始數組劃分為兩個子數組且兩個數組和相等,則每個數組元素和為原始數組總和的一半。令這個總和的一半為target,則需要在原始數組中找到是否存在某個元素等于target,或是存在幾個元素之和為target。

這里要注意的是,本題與在某個數組中尋找是否存在元素target不一樣,因為本題的target不一定是一個元素,可以是多個元素之和,具體是幾個元素之和不確定。因此本題想要直接暴力求解的話,會特別耗時。

因此需要結合01背包思想解決問題,將尋找元素和為target的問題轉化為容量為target的背包,恰好需要裝滿的問題。把所有元素當做可以裝入背包的物品,每個元素占用空間和帶來的價值都是元素數值本身。

初始化dp全0數組,下標表示背包容量,下標對應的數組值表示背包可以裝入物品的最大重量。本題難點在于循環條件和遞推公式,首先要遍歷所有物品,然后依據背包容量,更新背包裝入的物品重量,即:

  • 外層循環:遍歷每個數字?num

  • 內層循環:從?target?逆向遍歷到?num(避免重復計算)。

    • 狀態轉移:對于容量?j,選擇是否裝入?num

      • 不裝:dp[j]?保持不變。

      • 裝:dp[j-num] + num(當前和加上?num?的值)。

    • 取兩者最大值更新?dp[j]

代碼:

class Solution:def canPartition(self, nums: List[int]) -> bool:n = len(nums)if n <= 1:return Falsetotal = sum(nums)if total % 2 != 0:return Falsetarget = total // 2dp = [0] * 10001for num in nums:for j in range(target, num-1, -1):dp[j] = max(dp[j], dp[j-num]+num)if dp[target] == target:return Truereturn False
698.劃分為k個相等的子集

題目鏈接:698. 劃分為k個相等的子集 - 力扣(LeetCode)

思考:要判斷是否可以將數組分成k個非空子集,且每個子集的和相等,可以按照以下步驟進行:

  1. 總和檢查:首先計算數組所有元素的總和。如果總和不能被k整除,直接返回False,因為無法均分。

  2. 目標子集和:計算每個子集的目標和,即總和除以k。

  3. 排序優化:將數組排序,先處理較大的數,可以更快地剪枝無效路徑。

  4. 回溯法:使用回溯法嘗試將數字分配到各個子集中。每次嘗試將當前數字放入一個子集,如果該子集的和不超過目標和,則繼續遞歸處理剩下的數字。如果所有數字都能成功分配,則返回True,否則回溯并嘗試其他可能性。

代碼:

class Solution:def canPartitionKSubsets(self, nums: List[int], k: int) -> bool:n = len(nums)total = sum(nums)if total % k != 0:return Falsenums.sort(reverse=True)  # 排序以便更快剪枝target = total // kif nums[0] > target:return Falseused = [False] * ndef backtrack(start, current_sum, count):if count == k - 1:return Trueif current_sum == target:return backtrack(0, 0, count + 1)for i in range(start, n):if not used[i] and current_sum + nums[i] <= target:used[i] = Trueif backtrack(i + 1, current_sum + nums[i], count):return Trueused[i] = False# 剪枝:跳過相同數字while i + 1 < n and nums[i] == nums[i + 1]:i += 1# 如果當前和為0,說明無法放入任何數,直接失敗if current_sum == 0:breakreturn Falsereturn backtrack(0, 0, 0)
473.火柴拼正方形

題目鏈接:473. 火柴拼正方形 - 力扣(LeetCode)

思考:首先計算所有火柴的總長度 totalLen,如果 totalLen 不是 4 的倍數,那么不可能拼成正方形,返回 false。當 totalLen 是 4 的倍數時,每條邊的邊長為 len=?totalLen/4,用 edges 來記錄 4 條邊已經放入的火柴總長度。對于第 index 火柴,嘗試把它放入其中一條邊內且滿足放入后該邊的火柴總長度不超過 len,然后繼續枚舉第 index+1 根火柴的放置情況,如果所有火柴都已經被放置,那么說明可以拼成正方形。

為了減少搜索量,需要對火柴長度從大到小進行排序。

代碼:

class Solution:def makesquare(self, matchsticks: List[int]) -> bool:totalLen = sum(matchsticks)if totalLen % 4:return Falsematchsticks.sort(reverse=True)edges = [0] * 4def dfs(idx: int) -> bool:if idx == len(matchsticks): # 已經使用了所有火柴return Truefor i in range(4):edges[i] += matchsticks[idx] # 放入火柴if edges[i] <= totalLen // 4 and dfs(idx + 1):return Trueedges[i] -= matchsticks[idx]return Falsereturn dfs(0)

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

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

相關文章

純CSS實現自動滾動到底部

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>自動滾動到底部</title><style>*…

【新人系列】Golang 入門(十五):類型斷言

? 個人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 專欄地址&#xff1a;https://blog.csdn.net/newin2020/category_12898955.html &#x1f4e3; 專欄定位&#xff1a;為 0 基礎剛入門 Golang 的小伙伴提供詳細的講解&#xff0c;也歡迎大佬們…

AI大模型發展現狀與MCP協議誕生的技術演進

1. 大模型能力邊界與用戶痛點&#xff08;2023年&#xff09; 代表模型&#xff1a;GPT-4&#xff08;OpenAI&#xff09;、Claude 3&#xff08;Anthropic&#xff09;、通義千問&#xff08;阿里云&#xff09;等展現出強大的生成能力&#xff0c;但存在明顯局限&#xff1a…

深入理解Linux中的線程控制:多線程編程的實戰技巧

個人主頁&#xff1a;chian-ocean 文章專欄-Linux 前言&#xff1a; POSIX線程&#xff08;Pthreads&#xff09; 是一種在 POSIX 標準下定義的線程庫&#xff0c;它為多線程編程提供了統一的接口&#xff0c;主要用于 UNIX 和類 UNIX 系統&#xff08;如 Linux、MacOS 和 BS…

(mac)Grafana監控系統之監控Linux的Redis

Grafana安裝-CSDN博客 普羅米修斯Prometheus監控安裝&#xff08;mac&#xff09;-CSDN博客 1.Redis_exporter安裝 直接下載 wget https://github.com/oliver006/redis_exporter/releases/download/v1.0.3/redis_exporter-v1.0.3.linux-amd64.tar.gz 解壓 tar -xvf redis_…

鴻蒙應用元服務開發-Account Kit未成年人模式訂閱和處理用戶信息變更

一、概述 通過訂閱用戶信息變更&#xff0c;您可以接收有關用戶及其賬戶的重要更新。當用戶取消元服務的授權信息、注銷華為賬號時&#xff0c;華為賬號服務器會發送通知到元服務&#xff0c;元服務可以根據通知消息進行自身業務處理。 二、用戶信息變更事件介紹 三、訂閱用…

buildroot構建根文件系統報錯(已解決大部分問題)

title: buildroot構建根文件系統報錯(set FORCE_UNSAFE_CONFIGURE1) author: cbus categories: 小知識 tags:小知識 abbrlink: 53691 date: 2025-04-20 08:03:00 錯誤1 set FORCE_UNSAFE_CONFIGURE1 在使用buildroot構建根文件系統時&#xff0c;一切按照文檔的配置&#xff0…

7.QT-常用控件-QWidget|font|toolTip|focusPolicy|styleSheet(C++)

font API說明font()獲取當前widget的字體信息.返回QFont對象.setFont(const QFont& font)設置當前widget的字體信息. 屬性說明family字體家族.?如"楷體",“宋體”,"微軟雅?"等.pointSize字體??weight字體粗細.以數值?式表?粗細程度取值范圍為[…

通過面向目標的獎勵彌合人與機器人的靈活性差距

24年10月來自紐約大學的論文“Bridging the Human to Robot Dexterity Gap through Object-Oriented Rewards”。 直接通過人類視頻訓練機器人是機器人技術和計算機視覺領域的一個新興領域。盡管雙指機械手在雙指夾持器方面取得了顯著進展&#xff0c;但以這種方式讓多指機械手…

C++入門篇(下)

目錄 1、引用 1.1 引用概念 1.2 引用特性 1.3 常引用 1.4 使用場景 1.4.1 引用做參數 1.4.2 引用做返回值 1.5 引用和指針的區別 2、內聯函數 2.1 概念 2.2 特性 3、auto關鍵字 4、基于范圍的for循環 5、指針空值nullptr 5.1 C98 中的指針空值處理 5.2 C11 …

Multi-Query Attention (MQA) PyTorch 實現

和多頭注意力機制的唯一區別&#xff1a;K、V在不同的head之間實現了復用&#xff0c;而對于不同的頭&#xff0c;Q依然不同。 因此這里的代碼和標準多頭注意力的實現也是幾乎完全一樣&#xff1a; import torch import torch.nn as nn import torch.nn.functional as Fclass…

visual studio無法跳轉到函數定義、變量定義、跳轉函數位置不準問題解決

參考&#xff1a;https://blog.csdn.net/snakehacker/article/details/135438353 程序有時會出現大部分函數都不能準確的從頭文件中正確定位到函數定位,這是因為數據庫錯亂造成的,可以通過重構數據庫來解決,操作方法如下&#xff1a; 菜單欄&#xff1a;工具——選項 文本編輯…

Java優雅實現判空方法

在 Java 開發中&#xff0c;頻繁的 if (obj ! null) 判空代碼會導致代碼冗余、可讀性差&#xff0c;且容易遺漏判空導致 NullPointerException。以下從 語言特性、設計模式、工具類 和 編碼規范 四個維度&#xff0c;結合實際案例&#xff0c;詳解如何優雅處理空值問題。 一、…

京東百億補貼殺入外賣市場:一場關乎即時零售未來的攻防戰

當美團和餓了么在外賣市場雙雄爭霸十余年之際&#xff0c;京東突然以"百億補貼免傭金"的組合拳高調入場。這場看似跨界的外賣大戰&#xff0c;實則是互聯網巨頭對萬億級即時零售市場的生死爭奪。 外賣只是表象&#xff0c;即時零售才是終極戰場 京東黑板報4月10日官…

UNION和UNION ALL的主要區別

UNION和UNION ALL的主要區別在于處理重復數據和排序的方式。 UNION和UNION ALL都是SQL語言中用于合并兩個或多個SELECT語句結果集的關鍵字。它們的主要區別如下&#xff1a; 1、對重復結果的處理&#xff1a;UNION在進行表鏈接后會篩選掉重復的記錄&#xff0c;而UNION ALL不會…

七段碼 路徑壓縮 并查集 dfs

12.七段碼 - 藍橋云課 將七個二極管映射為 1-7 開一個二維矩陣 為 相鄰的邊連上線 edge[1][2] edge[1][6] 1;edge[2][1] edge[2][3] edge[2][7] 1;edge[3][2] edge[3][4] edge[3][7] 1;edge[4][3] edge[4][5] 1;edge[5][4] edge[5][6] edge[5][7] 1;edge[6][1…

科技如何改變世界?

技術是我們日常生活中不可或缺的一部分&#xff0c;以至于我們常常忘記了它的重要性。如果你正在科技領域工作&#xff0c;或者希望進入該領域&#xff0c;你可能是眾多有使命感的人之一&#xff0c;希望知道自己的日常工作能為社會或地球的長遠利益做出貢獻。 別再四處尋找了…

抽象的https原理簡介

前言 小明和小美是一對好朋友&#xff0c;他們分隔兩地&#xff0c;平時經常寫信溝通&#xff0c;但是偶然被小明發現他回給小美的信好像被人拆開看過&#xff0c;甚至偷偷被篡改過。 對稱加密算法 開頭的通信過程比較像HTTP服務器與客戶端的通信過程&#xff0c;全明文傳輸…

高級java每日一道面試題-2025年4月13日-微服務篇[Nacos篇]-Nacos如何處理網絡分區情況下的服務可用性問題?

如果有遺漏,評論區告訴我進行補充 面試官: Nacos如何處理網絡分區情況下的服務可用性問題&#xff1f; 我回答: 在討論 Nacos 如何處理網絡分區情況下的服務可用性問題時&#xff0c;我們需要深入理解 CAP 理論以及 Nacos 在這方面的設計選擇。Nacos 允許用戶根據具體的應用…

python解壓文件 zip tar.gz tar.xz

以下代碼為解壓zip包 tar包文件 zip_path&#xff1a;文件絕對路徑 output_folder&#xff1a;文件解壓后存放的文件夾路徑 def extract_file(zip_path, output_folder):# 支持解壓zip tar tar.gz tar.xz .tar.bz2# 確保輸出文件夾存在os.makedirs(output_folder, exist_okT…