Leetcode 1049 最后一块石头的重量II

  1. 题意理解

        有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。

        每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y

        思路转化:我们可以将题目转换为,将石头分为大小相等差不多的两堆,然后相互去撞击,这样留下来的残余的石头就是可剩余的最小重量

        如何将石头分为大小相等的两堆呢。

        target=sum(stones[])/2向上取整

        res=sum(stones[])-target 表示剩余的石头重量

        此时,再一次将题目转换为0-1背包问题:

        target表示背包重量,stones表示物品,stones[i]表示第i块石头的重量和价值。

        此时问题转换为将物品装入大小为target的背包,能获得的最大价值maxValue

        此时石头被分为:maxValue和sum-maxValue大小的两堆

        res=|sum-maxValue-maxValue|此时获得最小剩余大小的石头

解题思路

        首先理解题意,将其转换为一个背包问题,使用动态规划的思路来求解。

        动态规划五部曲:

        (1)dp[i][j]或dp[i]的含义

        (2)递推公式:

                dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+values[i])或

                dp[j]=max(dp[j],dp[j-weight[i]]+values[i])

        (3)根据题意初始化

        (4)遍历求解:先遍历包还是先遍历物品

        (5)打印——debug

1.动态规划二维dp数组

  1. dp[i][j]表示下标[0,j]的元素任务,放入大小为j的背包,能获得的最大价值
  2. 递推公式:dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+values[i])
  3. 初始化第一行,第一列。
  4. 遍历:由于二维数组完整保留了两个维度所有信息,所以先遍历背包还是先遍历物品,都是可以的。
public int lastStoneWeightII(int[] stones) {
        int sum=0;
        for(int num:stones)sum+=num;
        int target=(int)Math.ceil(sum/2);
        int[][] dp=new int[stones.length][target+1];
        //初始化
        for(int[] tmp:dp) Arrays.fill(tmp,-1);
        for(int i=0;i<stones.length;i++) dp[i][0]=0;
        for(int j=1;j<=target;j++){
            if(stones[0]>j) dp[0][j]=0;
            else dp[0][j]=stones[0];
        }
        //遍历
        for(int i=1;i<stones.length;i++){
            for(int j=1;j<=target;j++){
                if(stones[i]>j){
                    dp[i][j]=dp[i-1][j];
                }else{
                    dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-stones[i]]+stones[i]);
                }
            }
        }
        return Math.abs(sum-dp[stones.length-1][target]*2);
    }

2.一维滚动数组——存储压缩

  1. dp[j]表示装满大小为j的背包所能获得的最大价值。
  2. 递推公式:dp[j]=max(dp[j],dp[j-weight[i]]+values[i])
  3. 初始化:右边的值总是由最左边的值推导而来,而最坐标的值dp[0]表示背包大小为0所能获得的最大价值,所以有dp[0]=0.将所有元素初始化为0
  4. 遍历:由于以为滚动数组是二维dp数组的动态行滚动更新,所以遍历顺序总是先物品后背包。
  5. 注意:为了防止用同层修改过的值修改本行其他值,导致物体重复放置,故采用倒序遍历背包。
    public int lastStoneWeightII2(int[] stones) {
            int sum=0;
            for(int num:stones)sum+=num;
            int target=(int)Math.ceil(sum/2);
            int[] dp=new int[target+1];
            //初始化
            Arrays.fill(dp,0);
            //遍历
            for(int i=1;i<stones.length;i++){
                for(int j=target;j>=0;j--){
                    if(stones[i]>j){
                        dp[j]=dp[j];
                    }else{
                        dp[j]=Math.max(dp[j],dp[j-stones[i]]+stones[i]);
                    }
                }
            }
            return Math.abs(sum-dp[target]*2);
        }

3.分析

时间复杂度:O(n*target)

空间复杂度

        二维:O(n*target)

        一维:O(target)

n是nums的长度,target是sum(stones)/2的大小

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/309969.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA销售数据决策管理系统源码

JAVA销售数据决策管理系统源码 基于BS&#xff08;Extjs Strus2springhibernate Mysql&#xff09;的销售数据的决策支持 主要的功能有 系统功能具体内容包括基础资料、进货管理、出货管理、库存管理、决策分析、系统管理。

Flink-CEP 实战教程

文章目录 1. 基本概念1.1 CEP 是什么1.2 模式&#xff08;Pattern&#xff09;1.3 应用场景 2. 快速上手2.1 引入依赖2.2 入门实例 3. 模式API&#xff08;Pattern API&#xff09;3.1 个体模式3.1.1 基本形式3.1.2 量词&#xff08;Quantifiers &#xff09;3.1.3 条件&#x…

当心这46个重要漏洞!微软发布1月补丁日安全通告

近日&#xff0c;亚信安全CERT监测到微软1月补丁日发布了针对48个漏洞的修复补丁&#xff0c;其中&#xff0c;2个漏洞被评为紧急&#xff0c;46个漏洞被评为重要&#xff0c;共包含10个权限提升漏洞&#xff0c;11个远程代码执行漏洞&#xff0c;3个欺骗漏洞&#xff0c;11个信…

HTML---JavaScript操作DOM对象

目录 文章目录 本章目标 一.DOM对象概念 二.节点访问方法 常用方法&#xff1a; 层次关系访问节点 三.节点信息 四.节点的操作方法 操作节点的属性 创建节点 删除替换节点 五.节点操作样式 style属性 class-name属性 六.获取元素位置 总结 本章目标 了解DOM的分类和节点间的…

[C#]winform使用纯opencvsharp部署yolox-onnx模型

【官方框架地址】 https://github.com/Megvii-BaseDetection/YOLOX 【算法介绍】 YOLOX是一个高性能的目标检测算法&#xff0c;它是基于YOLO&#xff08;You Only Look Once&#xff09;系列算法的Anchor Free版本。YOLOX由Megvii Technology的研究团队开发&#xff0c;并在…

打架识别摄像机

随着社会治安问题的增加&#xff0c;打架事件在公共场所频繁发生&#xff0c;给社会治安带来了一定程度的威胁。因此&#xff0c;为了提高公共场所的安全性&#xff0c;可以利用现代科技&#xff0c;如人工智能和摄像技术&#xff0c;开发一种打架识别摄像机。 这种摄像机可以通…

AIGC实战——改进循环神经网络

AIGC实战——改进循环神经网络 0. 前言1. 堆叠循环网络2. 门控制循环单元3. 双向单元相关链接 0. 前言 我们已经学习了如何训练长短期记忆网络 (Long Short-Term Memory Network, LSTM) 模型&#xff0c;以学习使用给定风格生成文本&#xff0c;接下来&#xff0c;我们将学习如…

软件测试|MySQL HAVING分组筛选详解

简介 在 MySQL 数据库中&#xff0c;HAVING 子句用于在使用 GROUP BY 子句对结果进行分组后&#xff0c;对分组后的数据进行筛选和过滤。它允许我们对分组后的结果应用聚合函数&#xff0c;并基于聚合函数的结果进行条件过滤&#xff0c;从而得到我们需要的最终结果集。本文将…

RISC-V Bytes: Caller and Callee Saved Registers

原文链接1&#xff1a;https://danielmangum.com/posts/risc-v-bytes-caller-callee-registers/ 原文链接2&#xff1a;https://zhuanlan.zhihu.com/p/77663680 //主要讲栈帧 原文链接3&#xff1a;https://www.jianshu.com/p/b666213cdd8a //主要讲栈帧 This is part of a new…

2024年中级工程师职称业绩报告该怎么写呢?

1、在写报告时一定要注意时间问题&#xff0c;需要与项目实际时间一致&#xff0c;要把自己的工作经历写清楚&#xff0c;在项目里主要负责什么内容&#xff0c;担任什么职务。 2、可以写发现了什么问题&#xff0c;并如何去解决的&#xff0c;或者因为你发现和创新给项目带来的…

Mermaid 教程

Mermaid 教程 Mermaid 介绍 Mermaid 是一个用于生成流程图、时序图、甘特图等图表的 JavaScript 库。它使用类似于 Markdown 的文本语法&#xff0c;使得创建图表变得简单直观。以下是一个简单的 Mermaid 教程&#xff0c;介绍如何使用 Mermaid 创建流程图、时序图和甘特图。…

docker启动mongo

用户名&#xff1a;root 密码&#xff1a;123456 version: 3.1 services:mongo:image: mongo:7container_name: mongorestart: alwaysports:- 27017:27017volumes:- /opt/data/mongo:/data/dbenvironment:TZ: Asia/ShanghaiMONGO_INITDB_ROOT_USERNAME: rootMONGO_INITDB_ROO…

数字孪生+可视化技术 构建智慧新能源汽车充电站监管平台

前言 充电基础设施为电动汽车提供充换电服务&#xff0c;是重要的交通能源融合类基础设施。近年来&#xff0c;随着新能源汽车产业快速发展&#xff0c;我国充电基础设施持续增长&#xff0c;已建成世界上数量最多、服务范围最广、品种类型最全的充电基础设施体系。着眼未来新…

《C++ Primer》第14章 重载运算与类型转换(二)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 14.8 函数调用运算符&#xff08;P506&#xff09; 如果类重载了函数调用运算符&#xff0c;则我们可以像使用函数一样使用该类的对象。这样的类同时也能存储状态&#xff0c;所以它们比普通函数更加灵活。…

Android可换行的RadioGroup

Android可换行的RadioGroup,有时候需要换行显示的单选列表&#xff0c;当然可以有多种实现方式&#xff0c;比如recycleview或者listview实现&#xff0c;本文采用的是RadioGrouprediobutton方式实现。 一、首先自定义view public class WrapRadioGroup extends RadioGroup {pr…

【XR806开发板试用】+ FreeRtos开发环境搭建

获取SDK SDK可以通过官网直接下载。 下载完成之后&#xff0c;通过gzip命令解压文件 gzip -d xr806_sdk.tar.gz 获取编译链工具 还是按照官网操作指南&#xff0c;下载 gcc-arm-none-eabi-8-2019-q3-update 下载之后进行解压&#xff0c;同理。 注意修改GCC路径&#xff0c…

三、C语言分支与循环知识点补充——随机数生成

本章分支结构的学习内容如下&#xff1a; 三、C语言中的分支与循环—if语句 (1) 三、C语言中的分支与循环—关系操作符 (2) 三、C语言中的分支与循环—条件操作符 与逻辑操作符(3) 三、C语言中的分支与循环—switch语句&#xff08;4&#xff09;分支结构 完 本章循环结构的…

直播预告丨看零售场,如何玩转 MaaS

今年&#xff0c;有一个被频繁提及的词是MaaS 这类工具正在帮助千行百业实现大模型落地产业 在零售场&#xff0c;特别是像京东这样拥有超高并发、超复杂协同的电商场内 也沉淀出了一套通用的AI基础设施——九数算法中台 从提升客户服务体验、平台效率出发&#xff0c;训练各…

AtCoder ABC194

这期比193稍微简单一点 C - Squared Error 手玩一下&#xff1a; N 3 N3 N3时 展开得 a 2 b 2 − 2 a b b 2 − c 2 − 2 b c a 2 c 2 − 2 a c a^2b^2-2abb^2-c^2-2bca^2c^2-2ac a2b2−2abb2−c2−2bca2c2−2ac 每个数平方项都要计算 n − 1 n-1 n−1次 减的那一份可…

MYSQL篇--事务机制高频面试题

事务 1 什么是数据库事务&#xff1f; 事务是一个不可分割的数据库操作序列&#xff0c;也是数据库并发控制的基本单位&#xff0c;其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作&#xff0c;要么都执行&#xff0c;要么都不执行。…