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…