[100天算法】-目标和(day 79)

题目描述

给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。示例:输入:nums: [1, 1, 1, 1, 1], S: 3
输出:5
解释:-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一共有5种方法让最终目标和为3。提示:数组非空,且长度不会超过 20 。
初始的数组的和不会超过 1000 。
保证返回的最终结果能被 32 位整数存下。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/target-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路 1: DP

简单理解一下题目就是,我们要从数组中选出一个正数集,然后剩下的数字自动变成了一个负数集,这两个集合的和要刚好等于目标数 S。

换句话说,我们要从原数组中选出一个子集,满足元素的和为 target(这个 target 不是原题中的 S),只要确定这个 target,剩下就是 0-1 背包问题的套路了。

已知:

  • 正数集 + 负数集 = S
  • 正数集 - 负数集 = sum

sum 是原数组的和。

可得:

  • 正数集 = (S + sum) / 2

所以 (S + sum) / 2 就是我们要找的 target。

复杂度

  • 时间复杂度:$O(len*(sum+S)/2)$,len 是数组长度,sum 是数组元素和,S 是目标数。
  • 空间复杂度:$O((sum+S)/2)$。

代码

JavaScript Code

/*** @param {number[]} nums* @param {number} S* @return {number}*/
var findTargetSumWays = function (nums, S) {const sum = nums.reduce((a, b) => a + b, 0);if (sum < S) return 0;const sumOfPositives = (sum + S) / 2;if (sumOfPositives % 1 !== 0) return 0;const dp = Array(sumOfPositives + 1).fill(0);// target 为 0 时,正数集为空// 也就是只有给所有数字都加上 - 号这一种方法dp[0] = 1;for (const n of nums) {for (let i = sumOfPositives; i >= n; i--) {dp[i] = dp[i] + dp[i - n];}}return dp[sumOfPositives];
};

思路 2: DFS

DFS 枚举所有排列组合,计算组合的和,如果满足和等于 S 则结果++。

复杂度

  • 时间复杂度:$O(2^n)$,n 是数组长度。
  • 空间复杂度:$O(logn)$。

代码

JavaScript Code

/*** @param {number[]} nums* @param {number} S* @return {number}*/
var findTargetSumWays = function (nums, S) {const dfs = (nums, i, sum) => {if (sum === S && i === nums.length) return 1;if (i > nums.length) return 0;return (dfs(nums, i + 1, sum + nums[i]) + dfs(nums, i + 1, sum - nums[i]));};return dfs(nums, 0, 0);
};

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

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

相关文章

卸载本地开发环境,拥抱容器化开发

以前在公司的时候&#xff0c;使用同事准备的容器化环境&#xff0c;直接在 Docker 内进行开发&#xff0c;爽歪歪呀。也是在那时了解了容器化开发的知识&#xff0c;可惜了&#xff0c;现在用不到那种环境了。所以打算自己在本地也整一个个人的开发环境&#xff0c;不过因为我…

S-Clustr(影子集群) 重磅更新!黑入工业PLC设备!

公告 项目地址:https://github.com/MartinxMax/S-Clustr 更新预告内容进度SIEMENS S7-200 SMART远程控制进行中 开发人员Blog联系方式提交时间提交内容授权情况ASH_HHhttps://blog.csdn.net/m0_53711047/article/details/133691537?spm1001.2014.3001.5502匿名2023-10-16 2…

USB复合设备构建CDC+HID鼠标键盘套装

最近需要做一个小工具&#xff0c;要用到USB CDCHID设备。又重新研究了一下USB协议和STM32的USB驱动库&#xff0c;也踩了不少坑&#xff0c;因此把代码修改过程记录一下。 开发环境&#xff1a; ST-LINK v2 STM32H743开发板 PC windows 11 cubeMX v6.9.2 cubeIDE v1.13.2 cub…

Feature Pyramid Networks for Object Detection(2017.4)

文章目录 Abstract1. Introduction3. Feature Pyramid NetworksBottom-up pathwayTop-down pathway and lateral connections 7. Conclusion FPN Abstract 特征金字塔是识别系统中检测不同尺度物体的基本组成部分。但最近的深度学习对象检测器避免了金字塔表示&#xff0c;部分…

VS Code画流程图:draw.io插件

文章目录 简介快捷键 简介 Draw.io是著名的流程图绘制软件&#xff0c;开源免费&#xff0c;对标Visio&#xff0c;用过的都说好。而且除了提供常规的桌面软件之外&#xff0c;直接访问draw.io就可以在线使用&#xff0c;堪称百分之百跨平台&#xff0c;便捷性直接拉满。 那么…

重生之我是一名程序员 31

大家晚上好&#xff01;前面给大家分享了指针与数组的知识&#xff0c;所以今天要给大家分享的知识是——指针数组 相信大家在这里都会有疑问&#xff0c;指针数组是指针还是数组&#xff1f; 在这我们可以类⽐⼀下其他类型的数组&#xff0c;比如整型数组是存放整型的数组&am…

python科研绘图:绘制X-bar图

目录 1.X-bar 图的基本概念 2.X-bar 图的绘制过程 3.X-bar 图的优势 4.X-bar 图的绘制 1.X-bar 图的基本概念 X-bar控制图是一种统计工具&#xff0c;用于监控和控制生产过程中的质量变量。它是过程能力分析和统计过程控制&#xff08;SPC&#xff0c;Statistical Process…

SystemVerilog学习 (5)——接口

一、概述 验证一个设计需要经过几个步骤&#xff1a; 生成输入激励捕获输出响应决定对错和衡量进度 但是&#xff0c;我们首先需要一个合适的测试平台&#xff0c;并将它连接到设计上。 测试平台包裹着设计,发送激励并且捕获设计的输出。测试平台组成了设计周围的“真实世界”,…

Python---数据序列中的公共方法

公共方法就是 支持大部分 数据 序列。 常见公共方法---简单 运算符描述支持的容器类型合并字符串、列表、元组*复制字符串、列表、元组in元素是否存在字符串、列表、元组、字典not in元素是否不存在字符串、列表、元组、字典 案例&#xff1a; 合并 代码&#xff1a; # …

【Nginx】nginx | 微信小程序验证域名配置

【Nginx】nginx | 微信小程序验证域名配置 一、说明二、域名管理 一、说明 小程序需要添加头条的功能&#xff0c;内容涉及到富文本内容显示图片资源存储在minio中&#xff0c;域名访问。微信小程序需要验证才能显示。 二、域名管理 服务器是阿里云&#xff0c;用的宝塔管理…

【探索Linux】—— 强大的命令行工具 P.15(进程间通信 —— system V共享内存)

阅读导航 引言一、system V的概念二、共享内存(1) 概念(2) 共享内存示意图(3) 共享内存数据结构 三、共享内存的使用1. 共享内存的使用步骤&#xff08;1&#xff09;包含头文件&#xff08;2&#xff09;获取键值&#xff08;ftok函数&#xff09;&#xff08;3&#xff09;创…

计算机视觉基础(7)——相机基础

前言 从这一节开始&#xff0c;我们来学习几何视觉。中层视觉包括相机模型、单目几何视觉、对极几何视觉和多目立体视觉等。在学习几何视觉最开始&#xff0c;我们先来学习一下相机模型&#xff0c;了解相机的基本原理&#xff0c;了解相机如何记录影像。 一、数字相机 1.1 基…

nodejs+vue黄河风景线旅游网站的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

本文首先对该系统进行了详细地描述&#xff0c;然后对该系统进行了详细的描述。管理人员增加了系统首页、个人中心、用户管理、景点分类管理、景点简介管理、旅游路线管理、文章分类管理、公告文章管理、系统管理理等功能。这套黄河风景线旅游网站是根据当前的现实需要&#xf…

js如何阻塞固定时间

js本身没有提供睡眠方法&#xff0c;因为js阻塞了会导致页面渲染等工作也阻塞&#xff0c;所以一般没有这个需求&#xff0c;但是有时候为了测试&#xff0c;需要一个阻塞方法&#xff0c;下面是方法&#xff1a; 方法一&#xff1a; 使用while循环 let sleep function(ms){…

css中的hover用法示例(可以在vue中制作鼠标悬停显示摸个按钮的效果)

css中的hover 1、hover的定义 hover选择器用于选择鼠标指针浮动在上面的元素&#xff0c;它适用于所有元素&#xff0c;可以用来实现类似于js的一些功能。 2.hover的作用 css中hover属性&#xff0c;鼠标移到上面的时候可以激活&#xff0c;它可以实现悬浮元素上改变样式&a…

如何在 Nginx Proxy Manager(NPM)上部署静态网站

前言 众所周知&#xff0c;我们在之前介绍过 Nginx Proxy Manager&#xff08;以下简称 NPM) 这个反向代理的神器&#xff0c;对于一些 Docker 搭建的 Web 项目&#xff0c;NPM 能够很轻松地给他们做反向代理。 然而对于一些静态网站&#xff0c;小伙伴们可能不知道怎么用 NP…

Unity反编译:IL2CPP 打包输出的cpp文件和dll(程序集)位置、Mono打包输出的dll(程序集)位置

目录 如题&#xff1a;IL2CPP 打包输出的cpp文件和dll位置(并不会出现在APK里) 如题&#xff1a;Mono打包输出的dll位置 校验平台&#xff1a;Android 如题&#xff1a;IL2CPP 打包输出的cpp文件和dll位置(并不会出现在APK里) Unity Assets同级目录下 Temp/StagingArea/Il2…

Vue CLI脚手架安装、搭建、配置 和 CLI项目分析

目录 一、CLI快速入门 1. 官方介绍 : 2.安装Vue CLI : 3.搭建Vue CLI : 4.IDEA配置Vue CLI : 二、Vue CLI项目分析 1.结构分析 : 1.1 config 1.2 node_modules 1.3 src 1.4 static 2.流程分析 : 2.1 main.js 2.2 router/index.js 2.3 components/HelloWorld.vue 2.4 A…

《QT从基础到进阶·二十七》进度条QProgressBar

ui.ProgressBar.setValue(45); //45% ui.ProgressBar.setMin(0); ui.ProgressBar.setMax(255);0到100分为255份&#xff0c;值为215时&#xff0c;进度条为100/255*215 84% 点击主界面弹出进度条QProgressDialog 常用功能&#xff1a; setWindowFlags(Qt::Dialog | Qt::Cu…

为何电脑要设置网络掩码?

问题描述 既然子网掩码是为了让路由器能够决定一个数据包在局域网内发送还是发到公网&#xff0c;那么按道理只有路由器需要知道子网掩码&#xff0c;为什么在固定IP时每台计算机都需要单独设置子网掩码&#xff1f;有没有什么情况同一局域网内各计算机所设置的子网掩码有不同…