Leetcode 494 目标和

题意理解

        给你一个非负整数数组 nums 和一个整数 target 。

        向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :

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

        返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

        

        简单来说:就是在元素前面加‘+’或‘-’使其结果值为target。

        可以将其思路转换为:将数组元素分为两部分,其差为target

        则有part1-part2=target,part1+part2=sum

        part1=(sum+target)/2

        

        固有我们需要将数组元素分为两部分,一部分较大的为part1=(sum+target)/2,较小的部分为part2=(sum-target)/2。

        此时,我们再次转变思路:将其构造成0-1背包问题:

        背包大小为m=(sum+target)/2

        物品为[0,n]的元素,其价值和重量都是nums[]

        接下来,使用动态规划中的0-1背包思路解决问题。

解题思路

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

         动态规划五部曲:

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

        (2)递推公式

        (3)根据题意初始化

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

        (5)打印——debug

1.动态规划二维dp数组

  1. dp[i][j]表示[0,i]的元素装满大小为j的背包有多少种方法。
  2. 递推公式:dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i]]​​​​​​​​​​​​​,
    1. 当当前物品大于当前背包的大小时,放满大小为j的背包的方法数仍就为dp[i-1][j].
    2. 当当前物品小于等于当前背包的大小时,放满大小为j的背包的方法数=dp[i-1][j]+dp[i-1][j-nums[i]],其中dp[i-1][j-nums[i]]是增加了物品nums[i]后增加的方法数。​​​​​​​​​​​​​
  3. 初始化:初始化第一列,其中特别的:放满背包大小0 有多少种方法——要么什么也不放,要么放入大小为0的物品。初始化时要根据问题,具体分析。
  4. 遍历:由于二维数组保留了两个维度所有值,所以先便利包还是先遍历物品都可以
public int findTargetSumWays(int[] nums, int target) {int sum=0;for(int num:nums){sum+=num;}//是否能按照需求分成两部分if((sum+target)%2!=0) return 0;if((sum-target)%2!=0) return 0;//把所有值当作整数,分成两部分一正一负即可,所以如果target总保持为正数if(target<0) target=-target;int size= (int)Math.ceil((float)(sum+target)/2);int dp[][]=new int[nums.length][size+1];//初始化for(int[] temp:dp) Arrays.fill(temp,0);int countZero=0;for(int i=0;i<nums.length;i++){if(nums[i]==0) countZero++;dp[i][0]=countZero+1;}for(int j=1;j<=size;j++){if(nums[0]==j) dp[0][j]=1;else dp[0][j]=0;}//遍历顺序for(int i=1;i< nums.length;i++){for(int j=0;j<=size;j++){if(j<nums[i]){dp[i][j]=dp[i-1][j];}else{dp[i][j]=dp[i-1][j]+dp[i-1][j - nums[i]];}}}return dp[nums.length-1][size];}

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

  1. dp[j]表示装满大小为j的背包有多少种方式。
  2. 递推公式:dp[j]=max(dp[j],dp[j-weight[i]]+values[i])
  3. 初始化:右边的值总是由最左边的值推导而来,dp[0]表示使背包价值为0有多少种放置方法——要么什么也不放,要么放大小为0的物品。
  4. 遍历:由于以为滚动数组是二维dp数组的动态行滚动更新,所以遍历顺序总是先物品后背包。
  5. 注意:为了防止用同层修改过的值修改本行其他值,导致物体重复放置,故采用倒序遍历背包。
 public int findTargetSumWays(int[] nums, int target) {int sum=0;for(int num:nums) sum+=num;if((sum+target)%2!=0) return 0;if((sum-target)%2!=0) return 0;if(target<0) target=-target;int size= (int)Math.ceil((float)(sum+target)/2);int dp[]=new int[size+1];//初始化Arrays.fill(dp,0);dp[0]=1;//遍历顺序for(int i=0;i< nums.length;i++){for(int j=size;j>=nums[i];j--){dp[j] += dp[j - nums[i]];}}return dp[size];}

3.分析

时间复杂度:O(n^{^{2}})

空间复杂度

        二维:O(n*size)

        一维:O(size)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年全国职业院校技能大赛软件测试赛题—单元测试卷⑥

单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应分析处理并显示结果。返回结果“ax&#xff1a;”&#xff08;x为2、3或4&#xff09;&#xff1b;其中变量x、y均须为整型。编写程序代码&#xff0c;使用JUnit框架编写测试类对编写的程序代码进行测试…

【微信小程序开发】深入学习小程序开发之功能扩展和优化

前言 随着移动互联网的快速发展&#xff0c;微信小程序作为一种轻量级应用&#xff0c;已经逐渐成为许多企业和个人进行业务推广和服务提供的重要平台本文将详细介绍 微信小程序开发的功能扩展和优化&#xff0c;帮助开发者更好地提升小程序的用户体验和性能。 一、功能扩展 …

【Docker】Docker安装入门教程及基本使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Docker实战》。&#x1f3af;&#x1f3af; &…

lvs+keepalived+nginx双主模式双主热备实现负载均衡

目录 一、原理 二、真实服务器nginx配置 三、lvs的keepalived配置 3.1 配置文件 3.2 开启keepalived服务 四、测试 4.1 测试访问VIP 4.2 模拟lvs01宕机 主机名IPnginx0111.0.1.31nginx0111.0.1.31lvs0111.0.1.33lvs0211.0.1.34VIP111.0.1.29VIP211.0.1.30 一、原理 lvskeepal…

oracle 19c容器数据库data dump数据泵传输数据(2)---11g导19c

目录 1.在11gnon-cdb数据库中创建测试用户 2.在19cCDB容器数据库中新建pdb2 3.执行命令导出 4.执行命令导入 Exporting from a Non-CDB and Importing into a PDB 我們要記住一点&#xff1a;如果是全库导出导入的话&#xff0c;目标数据库没有的表空间我们要事先创建&#…

HarmonyOS@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

Observed装饰器和ObjectLink装饰器&#xff1a;嵌套类对象属性变化 上文所述的装饰器仅能观察到第一层的变化&#xff0c;但是在实际应用开发中&#xff0c;应用会根据开发需要&#xff0c;封装自己的数据模型。对于多层嵌套的情况&#xff0c;比如二维数组&#xff0c;或者数…

应用在LCD显示器电源插头里的氮化镓(GaN)MTC-65W1C

LCD&#xff08;Liquid Crystal Display&#xff09;显示器是利用液晶显示技术来进行图像表现的显示装置&#xff0c;从液晶显示器的结构来看&#xff0c;无论是笔记本电脑还是桌面系统&#xff0c;采用的LCD显示屏都是由不同部分组成的分层结构。LCD显示器按照控制方式不同可分…

【gpt4 8k 免费使用】Coze 是一款用来开发新一代 AI Chat Bot 的应用编辑平台

Coze 快速开始 | Coze Welcome to Coze Coze 是什么&#xff1f; Coze 是一款用来开发新一代 AI Chat Bot 的应用编辑平台&#xff0c;无论你是否有编程基础&#xff0c;都可以通过这个平台来快速创建各种类型的 Chat Bot&#xff0c;并将其发布到各类社交平台和通讯软件上。…

2022-ECCV-Explaining Deepfake Detection by Analysing Image Matching

一、研究背景 1.大量工作将深度伪造检测作为一个二分类任务并取得了良好的性能。 2.理解模型如何在二分类标签的监督下学习伪造相关特征仍难是个艰巨的任务。 3.视觉概念&#xff1a;具有语义的人脸区域&#xff0c;如嘴、鼻子、眼睛。 二、研究目标 1.验证假设&#xff0c;并…

Qt框架学习 --- CTK

系列文章目录 文章目录 系列文章目录前言一、准备阶段二、使用介绍1.核心思想2.源码2.1.框架部分资源目录树2.2.框架部分源码2.3.插件部分资源目录树2.4.插件部分源码 3.文件结构4.运行效果 总结 前言 随着开发的深入&#xff0c;CTK框架还是要关注一下。了解CTK还是有必要的。…

陶瓷碗口缺口检测-图像获取与图像复原

图像获取 在陶瓷产品传送带上安装数据采集设备&#xff0c;如工业摄像头&#xff0c;进行图像数据采集。为提高陶瓷的检测精度&#xff0c;同时考虑到开发成本等问题采用高精度的CMOS工业摄像头进行数据采集。对图像进行灰度化处理&#xff0c; 图a为采集到的原彩色图像&#…

如何使用提示压缩来削减 RAG 80% 成本

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research) 原文标题:How to Cut RAG Costs by 80% Using Prompt Compression 原文地址:https://medium.com/towards-data-science/how…