LeetCode算法題解(動態規劃,背包問題)|LeetCode1049. 最后一塊石頭的重量 II、LeetCode494. 目標和

一、LeetCode1049. 最后一塊石頭的重量 II

題目鏈接:1049. 最后一塊石頭的重量 II
題目描述:

有一堆石頭,用整數數組?stones?表示。其中?stones[i]?表示第?i?塊石頭的重量。

每一回合,從中選出任意兩塊石頭,然后將它們一起粉碎。假設石頭的重量分別為?x?和?y,且?x <= y。那么粉碎的可能結果如下:

  • 如果?x == y,那么兩塊石頭都會被完全粉碎;
  • 如果?x != y,那么重量為?x?的石頭將會完全粉碎,而重量為?y?的石頭新重量為?y-x

最后,最多只會剩下一塊?石頭。返回此石頭?最小的可能重量?。如果沒有石頭剩下,就返回?0

示例 1:

輸入:stones = [2,7,4,1,8,1]
輸出:1
解釋:
組合 2 和 4,得到 2,所以數組轉化為 [2,7,1,8,1],
組合 7 和 8,得到 1,所以數組轉化為 [2,1,1,1],
組合 2 和 1,得到 1,所以數組轉化為 [1,1,1],
組合 1 和 1,得到 0,所以數組轉化為 [1],這就是最優值。

示例 2:

輸入:stones = [31,26,33,21,40]
輸出:5

提示:

  • 1 <= stones.length <= 30
  • 1 <= stones[i] <= 100
算法分析:
定義dp數組及下標含義:

dp[j]:表示容量為j的背包所能裝的物品最大價值(石頭的重量)為dp[j]。

遞推公式:

dp[j]=max(dp[j],dp[j-stones[i]]+stones[i])。

初始化:

dp[0]=0。

遍歷順序:

先遍歷物品在遍歷背包容量。

代碼如下:

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 mid;mid = sum / 2;int[] dp = new int[mid + 1];for(int i = stones[0]; i <= mid; i++)dp[i] = stones[0];for(int i = 1; i < len; i++) {for(int j = mid; j >= stones[i]; j--) {dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);}}return sum - dp[mid] * 2;}
}

二、LeetCode494. 目標和

題目鏈接:494. 目標和
題目描述:

給你一個非負整數數組?nums?和一個整數?target?。

向數組中的每個整數前添加?'+'?或?'-'?,然后串聯起所有整數,可以構造一個?表達式?:

  • 例如,nums = [2, 1]?,可以在?2?之前添加?'+'?,在?1?之前添加?'-'?,然后串聯起來得到表達式?"+2-1"?。

返回可以通過上述方法構造的、運算結果等于?target?的不同?表達式?的數目。

示例 1:

輸入:nums = [1,1,1,1,1], target = 3
輸出:5
解釋:一共有 5 種方法讓最終目標和為 3 。
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3

示例 2:

輸入:nums = [1], target = 1
輸出:1

提示:

  • 1 <= nums.length <= 20
  • 0 <= nums[i] <= 1000
  • 0 <= sum(nums[i]) <= 1000
  • -1000 <= target <= 1000
算法分析:

設添加+的元素集合總和為add,添加-的元素集合總和為des,則原數組的所有元素之和sum=add+des

由題意target=add-des;

des=add-target;

sum=add+(add-target);

add=(sum+target)/2;

所以我們只需要在原數組中找出和等于add的方法數就可以了。

于是我們可以用動態規劃中背包思路來解。

定義dp數組及下標含義:

dp[j]表示元素和為j的方法有dp[j]種。

遞推公式:

dp[j]+=dp[j-nums[i]];

例如:若有元素1,2,3,4,5,6,則加上該元素后和為5的方法有dp[5]=dp[5-1]+dp[5-2]+dp[5-3]+dp[5-4]+dp[5-5]種(j>=nums[i])。

初始化:

我們初始化dp[0]=1;

表示元素和為0的方法有一種,因為如果為0的話那么所有的遞推結果都將為0。

遍歷順序:

先遍歷元素在遍歷總和。

代碼如下:

class Solution {public int findTargetSumWays(int[] nums, int target) {int len = nums.length;int sum = 0;//數組總和for(int i = 0; i < len; i++)sum += nums[i];if(Math.abs(target) > sum) return 0;//如果target的絕對值大于sum,那么無論數組中所有元素都取正還是負都不肯能等于targetif((sum + target) % 2 != 0) return 0;//沒有結果,如sum是5target是0的話,無解int add = (sum + target) / 2;int[] dp = new int[add + 1];dp[0] = 1;for(int i = 0; i < len; i++) {for(int j = add; j >= nums[i]; j--) {dp[j] += dp[j - nums[i]];}}return dp[add];}
}

總結

求背包問題時要明確定義dp數組所表示的含義,對于不同的問題可能會有不同的定義,

如1049. 最后一塊石頭的重量 II中,dp[j]表示容量為j的背包所能裝的石頭的重量最大為dp[j]。

而494. 目標和中dp[j]表示裝滿容量為j的方法有dp[j]種。

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

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

相關文章

springboot2.1升級到2.7 actuator丟失部分metrics端點

項目場景&#xff1a; 項目需要升級springboot從2.1升級至2.7 問題描述 發現之前的metrics后面的jvm相關的端口丟了 原因分析&#xff1a; 找到這樣一篇博文https://blog.csdn.net/CL_YD/article/details/120309094&#xff0c;這篇博文意思是對的&#xff0c;但是寫的不太好…

Java基于springoot開發的企業招聘求職網站

演示視頻&#xff1a; https://www.bilibili.com/video/BV1xw411n7Tu/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 技術&#xff1a;springootmysqlvuejsbootstrappoi制作word模板 主要功能&#xff1a;求職者可以注冊發布簡歷&#xff0c;選擇簡…

案例018:基于微信小程序的實習記錄系統

文末獲取源碼 開發語言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 數據庫&#xff1a;mysql 5.7 開發軟件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序開發軟件&#xff1a;HBuilder X 小程序…

【python入門篇】函數(6)

這一節將詳細介紹Python中函數的用法&#xff0c;包括函數的定義、調用、參數、返回值、作用域等。 函數的概述&#xff1a; Python函數是一種封裝了特定任務的可重用代碼塊。通過將程序分解為更小、更具體的任務&#xff0c;函數提供了一種有效的方式來組織和管理代碼&#xf…

保姆級連接FusionInsight MRS kerberos Hive

數新網絡&#xff0c;讓每個人享受數據的價值https://xie.infoq.cn/link?targethttps%3A%2F%2Fwww.datacyber.com%2F 概述 本文將介紹在華為云 FusionInsight MRS&#xff08;Managed Relational Service&#xff09;的Kerberos環境中&#xff0c;如何使用Java和DBeaver實現遠…

threejs創建一個旋轉的正方體【完整代碼】

效果&#xff1a; 中文網three.js docs 1.搭建環境 安裝three 首先我們需要新建一個項目 vue/react都可 這里以vue為演示 npm i three 找到一個新的頁面 在頁面script的地方導入three import * as THREE from "three" 或者自己逐個導入 import {PerspectiveC…

京東采銷面對面,洞悉行業新趨勢 京東3C數碼生態大會在武漢圓滿舉行

為促進湖北省3C數碼產業發展&#xff0c;本地企業降本增效、促進行業交流、充分發揮京東集團全鏈路生態服務能力&#xff0c;支持地方3C特色產業提質增量。2023年11月23日&#xff0c;由京東零售、京東物流主辦&#xff0c;湖北省電子商務行業協會聯合協辦的“聚力共贏、攜手共…

【Kotlin精簡】第9章 Kotlin Flow

1 前言 上一章節我們學習了Kotlin的協程【Kotlin精簡】第8章 協程&#xff0c;我們知道 協程實質是對線程切換的封裝&#xff0c;能更加安全實現異步代碼同步化&#xff0c;本質上協程、線程都是服務于并發場景下&#xff0c;其中協程是協作式任務&#xff0c;線程是搶占式任務…

保姆級 ARM64 CPU架構下安裝部署Docker + rancher + K8S 說明文檔

1 K8S 簡介 K8S是Kubernetes的簡稱&#xff0c;是一個開源的容器編排平臺&#xff0c;用于自動部署、擴展和管理“容器化&#xff08;containerized&#xff09;應用程序”的系統。它可以跨多個主機聚集在一起&#xff0c;控制和自動化應用的部署與更新。 K8S 架構 Kubernete…

從Redis反序列化UserDetails對象異常后中發現FastJson序列化的一些問題

最近在使用SpringSecurityJWT實現認證授權的時候&#xff0c;出現Redis在反序列化userDetails的異常。通過實踐發現&#xff0c;使用不同的序列化方法和不同的fastJson版本&#xff0c;異常信息各不相同。所以特地記錄了下來。 一、項目代碼 先來看看我項目中redis相關配置信息…

視頻號小店常見問題分享,讓你少走彎路,少花冤枉錢!

我是電商珠珠 視頻號團隊自22年7月&#xff0c;就開始發展起了自己的電商平臺-視頻號小店。 關于視頻號小店有很多人可能還不太了解&#xff0c;尤其是對于新手來說&#xff0c;并不知道是干什么的。 我踏足電商這個領域也已經五六年了&#xff0c;視頻號小店也做了一年多了…

SpringBoot集成MapStruct

引入mapstruct依賴 <dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${org.mapstruct.version}</version> </dependency>配置maven-compiler-plugin <build><plugins>&…

VMware Workstation 17 虛擬機自啟動失效 解決腳本

VMware Workstation17新增加了虛擬機自啟配置 但是很奇怪在我的一臺計算機上能夠自啟&#xff0c;在另一臺計算機上就失效 編寫腳本 以命令方式完成虛擬機開機自啟 #虛擬機自啟.batif "%1""hide" goto CmdBegin start mshta vbscript:createobject("w…

緩存組件狀態,提升用戶體驗:探索 keep-alive 的神奇世界

&#x1f90d; 前端開發工程師&#xff08;主業&#xff09;、技術博主&#xff08;副業&#xff09;、已過CET6 &#x1f368; 阿珊和她的貓_CSDN個人主頁 &#x1f560; 牛客高級專題作者、在牛客打造高質量專欄《前端面試必備》 &#x1f35a; 藍橋云課簽約作者、已在藍橋云…

Day31| Leetcode 455. 分發餅干 Leetcode 376. 擺動序列 Leetcode 53. 最大子數組和

進入貪心了&#xff0c;我覺得本專題是最燒腦的專題 Leetcode 455. 分發餅干 題目鏈接 455 分發餅干 讓大的餅干去滿足需求量大的孩子即是本題的思路&#xff1a; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {…

仿ChatGPT對話前端頁面(內含源碼)

仿ChatGPT對話前端頁面&#xff08;內含源碼&#xff09; 前言布局樣式和Js部分關鍵點全部源碼 前言 本文主要講解如何做出類似ChatGPT的前端頁面。具體我們的效果圖是長這樣&#xff0c;其中除了時間是動態的之外&#xff0c;其他都是假數據。接下來讓我們從布局和樣式的角度…

Android Tombstone 與Debuggerd 原理淺談

一、前言 Android系統類問題主要有stability、performance、power、security。Android集成一個守護進程tombstoned是android平臺的一個守護進程&#xff0c;它注冊成3個socket服務端&#xff0c;客戶端封裝在crash_dump和debuggerd_client。 crash_dump用于跟蹤定位C crash&am…

前端入門(三)Vue生命周期、組件技術、事件總線、

文章目錄 Vue生命周期Vue 組件化編程 - .vue文件非單文件組件組件的注意點組件嵌套Vue實例對象和VueComponent實例對象Js對象原型與原型鏈Vue與VueComponent的重要內置關系 應用單文件組件構建 Vue腳手架 - vue.cli項目文件結構refpropsmixin插件scoped樣式 Vue生命周期 1、bef…

MBA-論證有效性分析

論證有效性分析∶分析下述論證中存在的缺陷和漏洞&#xff0c;選擇若干要點&#xff0c;寫一篇 600 字左石的文章.對該論證的有效性進行分析和評論。&#xff08;論證有效性分析的一般要點是∶概念特別是核心概念的界定和使用是否準確并前后一致&#xff0c;有無各種明顯的邏輯…

cineSync 3.3新功能: 深入iconik集成、激光工具、OTIOZ支持等

cineSync 3.3為大家帶來了靈活性和精準度&#xff0c;使連接審閱會話與iconik中的媒體管理和存儲更加容易&#xff0c;并且引入了顏色配置文件以快速測試顏色配置&#xff0c;還有通過激光指針等新工具帶來新的可能性。 在ftrack&#xff0c;我們意識到當今的遠程創意工作流比以…