代碼隨想錄算法訓練營第三十六天

LeetCode.1049?最后一塊石頭的重量 II

題目鏈接?最后一塊石頭的重量II

題解

class Solution {public int lastStoneWeightII(int[] stones) {int len = stones.length;int sum = 0;for(int i = 0;i<len;i++) sum += stones[i];int target = sum / 2;int[] dp = new int[target + 1];for(int i = 0;i<len;i++){for(int j = target;j>=stones[i];j--){dp[j] = Math.max(dp[j],dp[j-stones[i]] + stones[i]);}}int max_value = dp[target];return sum - max_value * 2;}
}

解題思路

這段代碼解決的是 "最后一塊石頭的重量 II" 問題,這是一個典型的動態規劃問題,本質上可以轉化為 0-1 背包問題。

算法思路解析:

  1. 問題轉化:將石頭分成兩堆,使兩堆的重量盡可能接近總和的一半。這樣兩堆石頭碰撞后剩下的重量就是最小可能值。
  2. 動態規劃思路
    • 計算所有石頭的總重量 sum
    • 目標是找到總和不超過 sum/2 的最大子集和
    • 使用 0-1 背包的動態規劃方法求解這個最大子集和

代碼解釋:

  • sum:計算所有石頭的總重量
  • target:總重量的一半,作為背包的最大容量
  • dp[j]:表示容量為 j 的背包能裝下的最大石頭重量
  • 內層循環采用倒序遍歷j,是為了避免同一石頭被多次使用(0-1 背包特性)
  • 最終結果sum - max_value * 2表示兩堆石頭碰撞后剩余的最小重量

LeetCode.494 目標和

題目鏈接?目標和

題解

class Solution {public int findTargetSumWays(int[] nums, int target) {int sum = 0;int len = nums.length;for(int i = 0;i<len;i++) sum += nums[i];if ((target + sum) % 2 == 1) return 0;if (Math.abs(target) > sum) return 0;int n = (sum + target) / 2;// 能湊成i容量的dp[i]種方法int[] dp = new int[n+1];dp[0] = 1;for(int i = 0;i<len;i++){for(int j = n;j>=nums[i];j--){dp[j] += dp[j - nums[i]];}} return dp[n];}
}

解題思路

這段代碼解決的是 "目標和" 問題,即通過給數組中的每個數字添加 "+" 或 "-",使得它們的和等于目標值 target,計算有多少種不同的方法。

算法思路解析:

  1. 問題轉化:假設數組中添加 "+" 的元素和為sumA,添加 "-" 的元素和為sumB,則有:

    • sumA - sumB = target
    • sumA + sumB = sum(數組總和)
      兩式相加可得?2*sumA = target + sum,即?sumA = (target + sum) / 2
  2. 關鍵判斷

    • 如果(target + sum)是奇數,無法整除,直接返回 0
    • 如果target的絕對值大于總和sum,也返回 0
  3. 動態規劃思路

    • 問題轉化為:從數組中選取若干元素,使其和等于sumA,計算有多少種選法
    • 這是一個典型的 "子集和計數" 問題,可用 0-1 背包的動態規劃方法解決

代碼解釋:

  • sum:計算數組所有元素的總和
  • n:即上述的sumA,表示需要湊出的目標和
  • dp[i]:表示能湊成和為 i 的方法總數
  • 初始化dp[0] = 1:表示湊成和為 0 的方法有 1 種(什么都不選)
  • 內層循環倒序遍歷,避免同一元素被重復使用
  • 最終結果dp[n]就是能湊成目標和的方法總數

LeetCode.474 一和零

題目鏈接?一和零

題解

class Solution {public int findMaxForm(String[] strs, int m, int n) {int[][][] dpArr = new int[strs.length][m + 1][n + 1];int zeroNum = 0;int oneNum = 0;for (char c : strs[0].toCharArray()) {if (c == '0') {zeroNum++;} else {oneNum++;}}for (int j = zeroNum; j <= m; j++) {for (int k = oneNum; k <= n; k++) {dpArr[0][j][k] = 1;}}for (int i = 1; i < strs.length; i++) {zeroNum = 0;oneNum = 0;for (char c : strs[i].toCharArray()) {if (c == '0') {zeroNum++;} else {oneNum++;}}for (int j = 0; j <= m; j++) {for (int k = 0; k <= n; k++) {if (j >= zeroNum && k >= oneNum) {dpArr[i][j][k] = Math.max(dpArr[i - 1][j][k], dpArr[i - 1][j - zeroNum][k - oneNum] + 1);} else {dpArr[i][j][k] = dpArr[i - 1][j][k];}}}}return dpArr[dpArr.length - 1][m][n];}
}

解題思路

這段代碼解決的是 "一和零" 問題,即在給定 0 和 1 的最大數量限制 (m 和 n) 的情況下,從字符串數組中選出最多數量的字符串,使這些字符串中包含的 0 總數不超過 m,1 總數不超過 n。

算法思路解析:

這是一個典型的二維 0-1 背包問題:

  • 每個字符串可以看作一個物品
  • 每個物品有兩個 "重量" 屬性:0 的數量和 1 的數量
  • 背包的兩個容量限制分別是 m (0 的最大數量) 和 n (1 的最大數量)
  • 目標是選擇最多數量的物品 (字符串) 而不超過背包容量

代碼解釋:

  1. 三維 DP 數組定義dpArr[i][j][k]表示在前 i 個字符串中,使用不超過 j 個 0 和 k 個 1 時能選取的最大字符串數量

  2. 初始化處理

    • 計算第一個字符串中 0 和 1 的數量
    • 對于能容納第一個字符串的所有 (j,k) 組合,初始化為 1 (表示選擇第一個字符串)
  3. 狀態轉移

    • 對每個字符串,先計算其包含的 0 和 1 的數量
    • 對每種可能的 0 和 1 的數量限制 (j,k):
      • 如果當前字符串可以被容納 (j>= 0 的數量且 k >= 1 的數量),則取 "不選當前字符串" 和 "選當前字符串" 兩種情況的最大值
      • 否則,只能繼承不選當前字符串的結果
  4. 最終結果dpArr[strs.length - 1][m][n]表示考慮所有字符串后,在 m 和 n 限制下能選取的最大字符串數量

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

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

相關文章

Apache Ignite 的監控與指標(Monitoring and Metrics)

這段文檔是關于 Apache Ignite 的監控與指標&#xff08;Monitoring and Metrics&#xff09; 的介紹&#xff0c;內容非常關鍵&#xff0c;尤其在生產環境中保障系統穩定性和性能時至關重要。 我們來一步步深入解析這段文字&#xff0c;幫助你徹底理解其含義和實際意義。&…

【ssh】ubuntu服務器+本地windows主機,使用密鑰對進行ssh鏈接

目錄1、服務器配置ssh2、本地主機秘鑰對3、上傳公鑰至服務器4、配置服務器的公鑰信息5、測試連接1、服務器配置ssh 使用的服務器系統為 ubuntu系統20.04 首先確認服務器是否已安裝SSH&#xff0c;已安裝的話會返回openssh 的相關信息&#xff0c;返回為空表示未安裝 dpkg -l …

Linux文件fd

文件理解 文件屬性內容 打開文件&#xff1a;本質是進程打開文件&#xff0c;文件沒被打開時候再磁盤上。 操作文件&#xff1a;本質是進程操作文件。 在操作系統內部&#xff0c;一定存在大量被打開的文件&#xff0c;會對其進行管理&#xff0c;每一個被打開的文件&#…

北京-4年功能測試2年空窗-報培訓班學測開-第六十四天-準備面試項目(焦慮)-同學開始面試

今日產出&#xff0c;整理自我介紹&#xff0c;繼續整理第一個項目&#xff0c;學習linux命令很焦慮啊很焦慮&#xff0c;很著急今天本打算結束第一個項目的&#xff0c;但是沒能夠&#xff0c;越說感覺越亂&#xff0c;讓同學聽我講&#xff0c;同學說&#xff0c;要聽睡著了于…

網絡是如何運轉的?——常見網絡協議與網絡分層模型

目錄 基本網絡協議 TCP&#xff08;傳輸控制協議&#xff09; 可靠傳輸&#xff1a;序列號確認應答重傳機制 序列號&#xff08;seq&#xff09; 確認應答&#xff08;ACK&#xff09; 超時重傳 三次握手與四次揮手 三次握手&#xff08;建立連接&#xff09; 四次揮手…

OpenAI放大招:ChatGPT學習模式上線,免費AI智能家教

目錄一、背景介紹二、學習模式是什么國內直接使用AI主流模型GPT-5也會第一時間同步更新。三、主要功能特點1、互動式提示2、分層次響應3、個性化支持4、知識檢查5、靈活切換四、學生如何使用學習模式1、訪問方式2、適用場景3、交互過程4、使用示例五、局限性1、依賴學生自覺性2…

設計模式:享元模式 Flyweight

目錄前言問題解決方案享元工廠結構代碼前言 享元是一種結構型設計模式&#xff0c;它摒棄了在每個對象中保存所有數據的方式&#xff0c;通過共享多個對象所共有的相同狀態&#xff0c;讓你能在有限的內存容量中載入更多對象。 問題 假如你希望在長時間工作后放松一下&#x…

Spring Boot容器化實戰:用官方OpenJDK鏡像極速啟動你的應用

前言 用 Docker 打包 Java 應用,尤其是 Spring Boot,簡直是開發者的超級利器。想象一下,你的程序就像勤快的外賣小哥,隨時待命,跑遍任何一臺機器,馬上為你服務。不論是開發環境還是生產環境,Docker 都能讓部署變得輕松又高效,徹底告別“環境不一致”的煩惱。 本篇文章…

【計算機網絡 | 第1篇】計算機網絡概述(上)

文章目錄一.現代通信基礎&#x1f95d;二.網絡、互聯網、英特網&#x1f9fe;1.網絡&#xff08;Network&#xff09;2.互聯網&#xff08;internet&#xff09;3.因特網&#xff08;Internet&#xff09;三.計算機網絡的標準定義&#x1f95d;早期定義&#x1f9fe;物理構成視…

python語法筆記

問題解決辦法 原本是個小問題&#xff0c;但是花了我大量時間。先說最后的解決辦法&#xff1a;360網絡急救箱搞的。一.問題描述 始終拉取失敗 二.解決過程 1.登陸憑證檢測&#xff0c;查下密碼是不是不對。2.清除GIT所有數據 3.使用SSH拉取 生成密鑰網站上添加密鑰SSH 拉取4.G…

XTOM藍光三維掃描儀:解鎖中小尺寸復雜零件的高精度3D檢測新境界

在3C消費電子行業&#xff0c;產品從出廠到用戶手中&#xff0c;可能經歷運輸、使用中的意外跌落。據統計&#xff0c;超過30%的電子產品售后問題與物理沖擊相關。跌落測試可模擬產品在運輸、使用中意外跌落的場景&#xff0c;可評估其結構強度、內部組件抗沖擊能力&#xff0c…

Django+celery異步:拿來即用,可移植性高

一、依賴環境 1、python解釋器版本&#xff1a;python3.7.5 2、穩定依賴包 # Celery 核心 celery5.2.7 kombu5.2.4 billiard3.6.4.0 vine5.0.0# Redis broker backend redis4.3.6# eventlet (如果用 -P eventlet)【windows系統可以使用】 eventlet0.33.3 greenlet1.1.3# 避免…

Ubuntu18.04 LTS +RTL 8125 出現安裝完系統后沒有網絡問題

Ubuntu18.04 LTS RTL 8125 出現安裝完系統后沒有網絡問題問題描述最終解決方案1.下載對應的Realtek網卡驅動&#xff0c;使用命令lspci查看網卡信息安裝網卡3.重啟電腦記錄過程1.內核升級方式1&#xff09;下載新的內核驅動2&#xff09;安裝內核驅動3&#xff09;重啟電腦4&am…

集成電路學習:什么是ARM CortexM處理器核心

ARM Cortex-M是ARM公司專為微控制器( Microcontroller)設計的處理器核心系列,它以其高性能、低功耗和易于開發的特點,在嵌入式系統和微控制器領域得到了廣泛應用。以下是關于ARM Cortex-M的詳細介紹: 一、ARM Cortex-M的概述 ARM Cortex-M系列處理器是基于ARM架構的高能效…

Apache Ignite 的分布式原子類型(Atomic Types)

以下的內容是關于 Apache Ignite 的分布式原子類型&#xff08;Atomic Types&#xff09;&#xff0c;主要包括 IgniteAtomicLong 和 IgniteAtomicReference。它們是 跨集群節點的“全局共享變量”&#xff0c;支持線程安全、原子性操作&#xff0c;即使多個節點同時訪問也能保…

Leetcode 08 java

283. 移動零 提示 給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 請注意 &#xff0c;必須在不復制數組的情況下原地對數組進行操作。 示例 1: 輸入: nums [0,1,0,3,12] 輸出: [1,3,12,0,0] 示例 2: 輸…

LeetCode 56 - 合并區間

思路 排序&#xff1a;將所有區間按起始點從小到大排序。貪心合并&#xff1a;初始化一個結果列表&#xff0c;放入第一個區間。然后遍歷剩余區間&#xff0c;將當前區間與結果列表中的最后一個區間比較&#xff1a; 若重疊&#xff08;當前區間起點 ≤ 結果區間終點&#xff0…

DNS 正向查找與反向查找

DNS 區域是 DNS 中基本的組織單元&#xff0c;為域名定義了管理和權威邊界。一個 DNS 區域通常包含一系列 DNS 資源記錄&#xff0c;包括名稱到地址的映射&#xff08;正向查找&#xff09;和地址到名稱的映射&#xff08;反向查找&#xff09;。這些區域對于高效管理和解析網絡…

Oracle ERP FORM開發 — 新增查詢條件

1 根據值來查詢具體流程步驟看第2節&#xff0c;這里提供核心的增加查詢條件的觸發器代碼&#xff1a;1.1 可完全匹配的值比如“是”&#xff0c;“否”&#xff0c;“物料”&#xff0c;“”汽車 等等這些可以直接通過對應的值匹配&#xff0c;特點就是詞語&#xff0c;短小。…

Flutter實現列表功能

在Flutter中,可以通過ListView和ListTile等組件來實現類似Android中RecyclerView和Adapter的功能。以下是一個通用的設計架構,用于設計列表數據: 1. 定義數據模型 首先,定義一個數據模型類,用于存儲列表中每一項的數據。例如: class ItemModel {final String title;fi…