494.力扣每日一题6/30 Java(三种解法)

news/2024/10/5 22:18:07/
  • 博客主页:音符犹如代码
  • 系列专栏:算法练习
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

目录

思路

解题方法

时间复杂度

空间复杂度

Code


解法一:递归

思路

通过递归的方式遍历数组中的每个数字,对于每个数字,都有加上或减去两种选择。在递归过程中,当遍历完数组时,判断当前的总和是否等于目标值,如果相等则表示找到了一种满足条件的表达式组合。

解题方法

使用了深度优先搜索(DFS)的思想,通过递归地探索所有可能的符号组合来计算满足目标值的表达式数量。

时间复杂度

O(n²)

空间复杂度

O(n)

Code

java">import java.util.Arrays;public class Solution {public int findTargetSumWays(int[] nums, int target) {return helper(nums, 0, target, 0);}public int helper(int[] nums, int index, int target, int currentSum) {if (index == nums.length) {if (currentSum == target) {return 1;}return 0;}int count = 0;count += helper(nums, index + 1, target, currentSum + nums[index]);count += helper(nums, index + 1, target, currentSum - nums[index]);return count;}
}

解法二:回溯法

思路

使用回溯法,通过递归地尝试对数组中的每个数字进行加和减的操作,来穷举所有可能的表达式组合。

解题方法

定义一个回溯函数backtrack,函数参数包括数组nums、当前处理的数字索引index、当前的总和currentSum以及目标值target。当index达到数组长度时,检查currentSum是否等于target,若相等则增加计数。否则,对于当前数字,分别进行加上和减去的操作,并递归调用自身处理下一个数字。

时间复杂度

𝑂(2*𝑛)

空间复杂度

O(n)

Code

java">public class Solution {public int findTargetSumWays(int[] nums, int target) {int totalCombinations = 1 << nums.length;int count = 0;for (int i = 0; i < totalCombinations; i++) {int sum = 0;for (int j = 0; j < nums.length; j++) {if ((i & (1 << j))!= 0) {sum += nums[j];} else {sum -= nums[j];}}if (sum == target) {count++;}}return count;}
}

解法三:动态规划

思路

首先计算数组元素的总和 sum 。如果目标值 target 的绝对值大于总和,或者 (target + sum) 不能被 2 整除,说明不存在满足条件的组合,直接返回 0 。然后将问题转化为找到一个子集,使得该子集元素之和为 (target + sum) / 2 ,通过计算这样的子集个数来得到满足目标和的表达式数量。

解题方法

使用动态规划,定义二维数组 dp[i][j] 表示处理到数组的第 i 个元素,和为 j 的不同表达式的数目。通过两层循环遍历数组和可能的和值,根据当前数字是否能加到当前和中更新 dp 值。

时间复杂度

O(n×m)

空间复杂度

O(n×m)

Code

java">public class Solution {public int findTargetSumWays(int[] nums, int target) {int totalCombinations = 1 << nums.length;int count = 0;for (int i = 0; i < totalCombinations; i++) {int sum = 0;for (int j = 0; j < nums.length; j++) {if ((i & (1 << j))!= 0) {sum += nums[j];} else {sum -= nums[j];}}if (sum == target) {count++;}}return count;}
}

一个人并不是生来要被打败的,你尽可以把他消灭掉,可就是打不败他。——《老人与海》


http://www.ppmy.cn/news/1473412.html

相关文章

Docker拉取失败,利用 Git将 Docker镜像重新打 Tag 推送到阿里云等其他公有云镜像仓库里

目录 一、开通阿里云容器镜像服务 二、Git配置 三、去DockerHub找镜像 四、编写images.txt文件 ​五、演示 六、其他注意事项 最近一段时间 Docker 镜像一直是 Pull 不下来的状态&#xff0c;想直连 DockerHub 是几乎不可能的。更糟糕的是&#xff0c;很多原本可靠的国内…

Python字符编码检测利器: chardet库详解

Python字符编码检测利器: chardet库详解 1. chardet简介2. 安装3. 基本使用3.1 检测字符串编码3.2 检测文件编码 4. 高级功能4.1 使用UniversalDetector4.2 自定义编码检测 5. 实际应用示例5.1 批量处理文件编码5.2 自动转换文件编码 6. 性能优化7. 注意事项和局限性8. 总结 在…

HY Lisp 读取宏(reader macro)学习

在学习HY lisp语言的时候HY编程快速入门实践课第三章 HY宏入门-CSDN博客&#xff0c;学习到了读取宏&#xff08;reader macro&#xff09;&#xff0c;尝试将其概念弄明白。 首先&#xff0c;读取宏是Lisp语言中都有的一种概念&#xff0c;所以可以通过任意一种Lisp语言的文档…

黑芝麻科技A1000简介

文章目录 1. A1000 简介2. 感知能力评估3. 竞品对比4. 系统软件1. A1000 简介

【ARM 常见汇编指令学习 7.1 -- LDRH 半字读取指令】

请阅读【嵌入式开发学习必备专栏】 文章目录 LDRH 使用介绍LDRH&#xff08;Load Register Half-word&#xff09;总结 LDRH 使用介绍 在ARMv9架构中&#xff0c;汇编指令LDRH用于从内存中载入数据到寄存器的指令&#xff0c;下面将分别对它进行详细介绍&#xff1a; LDRH&am…

spring-boot-starter-data-redis是否支持reactive响应式编程

开源项目SDK&#xff1a;https://github.com/mingyang66/spring-parent 个人文档&#xff1a;https://mingyang66.github.io/raccoon-docs/#/ spring-boot-starter-data-redis&#xff1a; 使用传统的基于阻塞的I/O编程模型&#xff0c;这意味着当你调用Redis操作时&#xff0…

手把手教你生成一幅好看的AI图片

很多人看到别人用SD生成出来的图片感到非常的羡慕&#xff0c;因为即使给了他们最好的SD软件&#xff0c;他们也是词穷&#xff0c;不知道该如何去描述要生成的图片。 别急&#xff0c;这篇文章会一步步的教会你怎么才能生成一个好看的AI图片。 跟着我&#xff0c;别走丢。 …

IOS17闪退问题Assertion failure in void _UIGraphicsBeginImageContextWithOptions

最近项目更新到最新版本IOS17&#xff0c;发现一个以前的页面突然闪退了。原来是IOS17下&#xff0c;这个方法 UIGraphicsBeginImageContext(CGSize size) 已经被移除&#xff0c;原参数如果size为0的话&#xff0c;会出现闪退现象。 根据说明&#xff0c;上述方法已经被替换…