【LeetCode: 494. 目标和 | 暴力递归=>记忆化搜索=>动态规划 | 背包模型】

news2025/2/27 17:22:18

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

🍔 目录

    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ 暴力法
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 记忆化搜索
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 动态规划
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚩 题目链接

  • 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

🌟 求解思路&实现代码&运行结果


⚡ 暴力法

🥦 求解思路

  1. 简单概括题目的意思就是给定我们一个nums数组,以及一个target目标,我们需要从nums中通过’+‘运算,或者’-'减运算,将所有的数字串联起来,最后得到target目标的总数。
  2. 这个题和我们的背包模型求解思路很像的,可以通过背包模型的思路求解。
  3. 有了基本的思路,接下来我们就来通过代码来实现一下。

🥦 实现代码

class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        return process(0,target,nums);
    }

    public int process(int index,int target,int[] nums){
        if(index>=nums.length) return target==0?1:0;
        return process(index+1,target+nums[index],nums)+process(index+1,target-nums[index],nums);
    }
}

🥦 运行结果

递归居然就通过了,为了帮助同学们更好的打通这个知识脉络,我们还是想往常一样,继续进行优化。
在这里插入图片描述


⚡ 记忆化搜索

🥦 求解思路

  1. 因为在递归的过程中,会重复的出现一些多次计算的结果,我们通过开辟一个数组,将结果提前缓存下来,算过的直接返回,避免重复计算,通过空间来去换我们的时间。
  2. 因为在计算缓存的时候,我们的状态的变量是有可能为负数的,如果我们存储到数组中需要进行离散化的处理,当然这是一种方式,此处我们选择另外一个方式,就是将结果缓存到Map集合中。

🥦 实现代码

class Solution {
    HashMap<String,Integer> map=new HashMap<>(); 
    public int findTargetSumWays(int[] nums, int target) {
        int n=nums.length;
        return process(0,target,nums);
    }

    public int process(int index,int target,int[] nums){
        if(index>=nums.length) return target==0?1:0;
        if(map.containsKey(index+"-"+target)){
            return map.get(index+"-"+target);
        }
        map.put(index+"-"+target,process(index+1,target+nums[index],nums)+process(index+1,target-nums[index],nums));
        return map.get(index+"-"+target);
    }
}

🥦 运行结果

通过缓存,将重复计算的结果缓存下来,为了后续的过程做准备。
在这里插入图片描述


⚡ 动态规划

🥦 求解思路

  1. 有了递归,有了记忆化搜索,接下来就是动态规划了,直接上手。

🥦 实现代码

优化:数组和sum,目标和s, 正数和x,负数和y,则x+y=sum,x-y=s,那么x=(s+sum)/2=target

class Solution {
    public int findTargetSumWays(int[] nums, int s) {
        int sum=Arrays.stream(nums).sum();
        if ((sum + s) % 2 != 0 || sum + s<0)
            return 0;
        int target = (sum + s) / 2;
        int[] dp=new int[target+1];
        dp[0] = 1;
        for (int num : nums){
            for (int i = target; i >= num; i--){
                dp[i] += dp[i - num];
            }
        }
        return dp[target];
    }
}

🥦 运行结果

动态规划搞定
在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring框架三】——Spirng IOC和DI的实现

系列文章目录 【Spring框架一】——Spring框架简介 Spirng IOC和DI的实现 系列文章目录前言一、IDEA新建Spring 项目二、使用XML文件的方式实现IOC和DI1.创建XML文件2. 通过构造函数的方式进行注入运行结果3.setter方法进行注入 三、使用注解的方式实现IOC和DISpring 5中的常用…

Django SQL注入漏洞 CVE-2022-28346

漏洞简介 Django 在2022年发布的安全更新&#xff0c;修复了在 QuerySet 的 annotate()&#xff0c; aggregate()&#xff0c; extra() 等函数中存在的 SQL 注入漏洞。 影响版本 2.2< Django Django <2.2.283.2< Django Django <3.2.134.0< Django Django <4…

Hadoop 4:Hive

数据仓库概念 数据仓库&#xff08;英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW&#xff09;,是一个用于存储、分析、报告的数据系统。 数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;分析结果为企业提供决策支持&#xff08;Decision Support&#x…

新版Mamba体验超快的软件安装

在一文掌握Conda软件安装&#xff1a;虚拟环境、软件通道、加速solving、跨服务器迁移中详细介绍的conda的基本使用和遇到问题的解决方式&#xff0c;也提到了mamba作为一个替代工具&#xff0c;可以很好的加速conda的solving environemnt过程。但有时也会遇到一个很尴尬的问题…

苹果笔要不要买?apple pencil的平替笔推荐

第一款ipad在10年前就已经出现了&#xff0c;它被用作平板电脑&#xff0c;功能非常强大。而现在&#xff0c;ipad的产品型号更新速度&#xff0c;也让ipad变得更加受欢迎。在这些设备中&#xff0c;ipad的辅助配件扮演着重要角色&#xff0c;比如今天我们要讲的这款电容笔&…

【LeetCode】《LeetCode 101》第八章:分治法

文章目录 8.1 算法解释8.2 表达式问题241. 为运算表达式设计优先级&#xff08;中等&#xff09;932. 漂亮数组&#xff08;中等&#xff09;312. 戳气球&#xff08;困难&#xff09; 8.1 算法解释 分治问题 通过「把原问题分为子问题&#xff0c;再将子问题进行合并处理」&a…

伙伴匹配推荐接口的优化策略【优先队列+多线程分批处理,java实现】

文章目录 接口背景接口问题说明优化策略用户匹配度计算接口改进与测试说明改进前改进一&#xff08;使用优先队列存储编辑距离较小的n个元素&#xff09;改进二&#xff08;使用优先队列存储编辑距离较小的n个元素数据分批查询、分批处理&#xff09;改进三&#xff08;使用优先…

算法修炼之练气篇——练气十九层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

互联网本来很简单,但为啥人们看的那么复杂

昨天有朋友问我互联网&#xff0c;说互联网怎么怎么创新。 我说你看到的都是像。佛说佛有十万身。这都是像&#xff0c;不是相。 &#xff08;1&#xff09; 500多年前&#xff0c;意大利美第奇家族为了给教皇运送全欧洲信民们的捐赠&#xff0c;所以建立了一张天网一张地网。天…

VMware 产品下载汇总 2023 持续更新中

本站 VMware 产品下载汇总&#xff1a;vSphere、NSX、Tanzu、Aria、Cloud… 请访问原文链接&#xff1a;https://sysin.org/blog/vmware/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 本站提供的 VMware 软件全部为 “试用版…

ENVI无缝镶嵌Seamless Mosaic工具镶嵌、拼接栅格遥感影像(所有图像需要含有地理信息)

本文介绍基于ENVI软件&#xff0c;利用“Seamless Mosaic”工具实现栅格遥感影像无缝镶嵌的操作。 在ENVI软件中通过“Pixel Based Mosaicking”工具实现栅格遥感影像的镶嵌的方法。这一工具虽然可以对不含有地理参考信息的遥感影像进行镶嵌&#xff0c;但是其镶嵌的整体效果并…

数据分析利器之python、IT应用架构规划详解(195页)、600多个人工智能AI工具汇总、营销革命5.0…| 本周精华...

▲点击上方卡片关注我&#xff0c;回复“8”&#xff0c;加入数据分析领地&#xff0c;一起学习数据分析&#xff0c;持续更新数据分析学习路径相关资料~&#xff08;精彩数据观点、学习资料、数据课程分享、读书会、分享会等你一起来乘风破浪~&#xff09;回复“小飞象”&…

Halcon 阈值分割(全局阈值threshold、binary_threshold、动态阈值 dyn_threshold)、直方图

文章目录 1 图像直方图2 全局阈值 threshold()3 binary_threshold()4 动态阈值mean_image() + dyn_threshold()5 代码和原图1 图像直方图 图像直方图(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素个数。 这种直方图中,横坐标的左…

后端返回文件流时,前端如何处理并成功下载流文件以及解决下载后打开显示不支持此文件格式

一、文件和流的关系 文件&#xff08;File&#xff09;和流(Stream)是既有区别又有联系的两个概念。 文件 是计算机管理数据的基本单位&#xff0c;同时也是应用程序保存和读取数据的一个重要场所。 存储介质&#xff1a;文件是指在各种存储介质上&#xff08;如硬盘、可…

WPF 使用 MaterialDesignThemes 项目Demo

前言&#xff1a; 最近在学B站的WPF项目实战合集(2022终结版)&#xff0c;但是到22P时候发现UI框架 MaterialDesignThemes的Github上面的程序没办法正常运行&#xff0c;最后折腾了好久终于解决。 github地址 gitcode镜像地址 下载成功后 下载成功后是如下效果 打开这个文…

audioop.rms函数解读和代码例子

该audioop模块包含对声音片段的一些有用操作。它对由8,16或32位宽的有符号整数样本组成的声音片段进行操作&#xff0c;并以Python字符串存储。这与al和sunaudiodev模块使用的格式相同。所有标量项都是整数&#xff0c;除非另有规定。 audioop.rms 即 sqrt(sum(S_i^2)/n) 这个公…

Linux运维常用sed命令使用

sed 是一种流式文本编辑器&#xff0c;常用于文本替换、文本过滤、行选择等操作。 常见的 sed 使用方法 1、替换文本中的字符串 使用 sed 可以在文本中替换指定的字符串。例如&#xff0c;将文本中所有的 old_text 替换为 new_text&#xff0c;可以执行以下命令&#xff1a; …

面向国际市场:利用FaceBook实现外贸贸易突破

在全球化的商业环境下&#xff0c;利用社交媒体平台如FaceBook来推动外贸贸易已经成为许多企业的关注焦点。FaceBook作为全球最大的社交媒体平台之一&#xff0c;为企业提供了众多机会和工具&#xff0c;以扩大市场触达、建立品牌形象和跨文化沟通。 本文将介绍一些简单却有效…

计算机组成原理---第五章 中央处理器习题详解版

&#xff08;一&#xff09;课内习题 &#xff08;二&#xff09;课后习题 1.请在括号内填入适当答案。在CPU中&#xff1a; (1)保存当前正在执行的指令的寄存器是( IR ); (2)保存当前正在执行的指令地址的寄存器是( AR ) (3)算术逻辑运算结果通常放在( DR )和( 通用寄存器…

【openGauss实战13】闪回技术

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…