首页 > 其他分享 >【LeeCode】377. 组合总和 Ⅳ

【LeeCode】377. 组合总和 Ⅳ

时间:2023-01-06 22:01:26浏览次数:59  
标签:target nums int LeeCode dp combinationSum4 new 377 总和

【题目描述】

给你一个由 不同 整数组成的数组 ​​nums​​​ ,和一个目标整数 ​​target​​​ 。请你从 ​​nums​​​ 中找出并返回总和为 ​​target​​ 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

​https://leetcode.cn/problems/combination-sum-iv/​


【示例】

【LeeCode】377. 组合总和 Ⅳ_java

【代码】

这里还是老老实实采用 【动态规划】

package com.company;
// 2023-1-6
import java.util.*;

class Solution {
public int combinationSum4(int[] nums, int target) {
// dp[i] 和为i在nums中出现过的元素有dp[i]个
int[] dp = new int[target + 1];
// 初始值: dp[0] 和为0的只有0这1个元素
dp[0] = 1;

// 完全背包: 组合(有顺序要求) 外层: target 内层: nums
for (int i = 1; i <= target; i++) {
for (int num: nums) {
if (i >= num){
dp[i] = dp[i] + dp[i - num];
}
}
}
System.out.println(Arrays.toString(dp));
return dp[target];
}
}
public class Test {
public static void main(String[] args) {
new Solution().combinationSum4(new int[]{1, 2, 3}, 4); // 输出: 7
new Solution().combinationSum4(new int[]{9}, 3); // 输出: 0
}
}


【代码】admin

通过率  8 / 15  这里采用【dfs的回溯 + 剪枝】算法,可以处理简单的计算,如果target太大会超时()

package com.company;
// 2023-1-6
import java.util.*;

class Solution {
List<List<Integer>> res = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
public int combinationSum4(int[] nums, int target) {
if (nums.length == 0 || target < 0) return -1;
// 很关键的一步,因为每次都是从第一个值开始累积,如果第一个值过大导致后面的计算直接跳过了
Arrays.sort(nums);
dfs(nums, target, 0, 0, list);
System.out.println(res);
return res.size();
}

private void dfs(int[] nums, int target, int index, int sum, LinkedList<Integer> list) {
if (sum == target){
res.add(new LinkedList<>(list));
return;
}

for (int i = index; i < nums.length && sum + nums[i] <= target; i++){
sum += nums[i];
list.add(nums[i]);
dfs(nums, target,0, sum, list);
sum -= nums[i];
list.removeLast();
}
}
}
public class Test {
public static void main(String[] args) {
new Solution().combinationSum4(new int[]{1, 2, 3}, 4); // 输出: 7
new Solution().combinationSum4(new int[]{9}, 3); // 输出: 0
new Solution().combinationSum4(new int[]{3,1,2,4}, 4); // 输出: 0
new Solution().combinationSum4(new int[]{4, 2, 1}, 4); // target = 32时会超时
}
}



标签:target,nums,int,LeeCode,dp,combinationSum4,new,377,总和
From: https://blog.51cto.com/u_13682316/5994544

相关文章

  • 【LeeCode】416. 分割等和子集 -- todo
    【题目描述】给你一个 只包含正整数 的 非空 数组 ​​nums​​ 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。​​​​https://leetcode.c......
  • 【LeeCode】322. 零钱兑换 - todo
    【题目描述】给你一个整数数组 ​​coins​​​ ,表示不同面额的硬币;以及一个整数 ​​amount​​ ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如......
  • 【LeeCode】494. 目标和 -- todo
    【题目描述】给你一个整数数组 ​​nums​​​ 和一个整数 ​​target​​ 。向数组中的每个整数前添加 ​​'+'​​ 或 ​​'-'​​ ,然后串联起所有整数,可以构造一......
  • 【LeeCode】152. 乘积最大子数组
    【题目描述】给你一个整数数组 ​​nums​​ ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32......
  • 力扣113 路径的总和 返回所有满足条件的路径
    力扣113路径的总和返回所有满足条件的路径题目:给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶......
  • 力扣112 路径的总和II
    力扣112路径的总和II题目:给你二叉树的根节点root和一个表示目标和的整数targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标......
  • 【LeeCode】198. 打家劫舍
    【题目描述】你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚......
  • 【LeeCode】2443. 反转之后的数字和
    【题目描述】给一个 非负 整数 ​​num​​ 。如果存在某个 非负 整数 ​​k​​​ 满足 ​​k+reverse(k)=num​​​ ,则返回 ​​true​​ ;否则,返回 ​......
  • 【LeeCode】14. 最长公共前缀
    【题目描述】编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ​​""​​。​​​​https://leetcode.cn/problems/longest-common-prefix......
  • 【LeeCode】58. 最后一个单词的长度
    【题目描述】给你一个字符串 ​​s​​,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的......