首页 > 其他分享 >【DP】LeetCode 题号.题目

【DP】LeetCode 题号.题目

时间:2023-04-19 09:36:24浏览次数:49  
标签:题目 target nums int LeetCode DP 数组 题号 dp

题目链接

377. 组合总和 Ⅳ

思路

分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律

在数组的动态规划问题中,一般 dp[i] 都是表示以 nums[i] 为结尾的状态;dp[i][j] 分别表示 以 nums1[i]nums2[j] 为结尾的状态,以此类推

字符串也是个数组,是字符数组

表示状态

这个题非常类似于爬楼梯问题:楼梯的阶数一共为target,一次可以走的步数为nums[i]。 一共有多少种走法?

如果这么考虑的话,其实和【DP】LeetCode 70. 爬楼梯非常相似,只不过在70题中固定为 nums = [1, 2]

所以我们用 dp[i] 表示在达到数值为 i 时(即上到第 i 层台阶时)能凑出的排列个数(即上楼梯的方法数)

注意:题目虽然叫做《组合总和》,但是因为“顺序不同的序列被视作不同的组合”,所以其实是种排列

找状态转移方程

在70题中我们的状态转移方程如下:

\[dp[i] = dp[i - 1] + dp[i - 2] \]

这个公式还可以这么写:

\[dp[i] = \sum^{n - 1}_{j = 0}{dp[i - nums[j]]}, i \geq nums[j] \]

这样的话就推广到了普遍的 nums 数组情况

边界处理

dp[0][0] = 1

代码

dp数组版

class Solution {
    public int combinationSum4(int[] nums, int target) {
        // 爬楼梯问题 
	// 楼梯的阶数一共为target,一次可以走的步数为nums[i]。求一共有多少种走法
        int[] dp = new int[target + 1];
        dp[0] = 1;

        for(int i = 1; i <= target; i++){
            for(int j = 0; j < nums.length; j++){
                if(i >= nums[j]){
                    dp[i] += dp[i - nums[j]];
                }
            }
        }

        return dp[target];
    }
}

标签:题目,target,nums,int,LeetCode,DP,数组,题号,dp
From: https://www.cnblogs.com/shixuanliu/p/17332004.html

相关文章

  • leetcode刷题随笔(2)
    42.收集雨水(TrappingRainWater)方法一:利用双指针交叉循环求解,时间复杂度O(n)//接雨水inttrap(vector<int>&height){inti=0,j=height.size()-1;intleft_max=0,right_max=0;intvan=0;while(i<j){if(height[i]......
  • LeetCode Top100: 反转链表 (python)
     给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出:[] 提示:链表中节点的数目范围是 [0,5000]-5000<=Node.val<=5000实现:给你......
  • LeetCode Top100: 翻转二叉树(python)
    给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[] 提示:树中节点数目范围在 [0,100] 内-100<=Node.val<=100实......
  • LeetCode Top 100: 二叉树的直径 (python)
     给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。 示例:给定二叉树1/\23/\45返回 3,它的长度是路径[4,2,1,3]......
  • 4月18日leetcode二叉树几种遍历方式的非递归和递归
    给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例1:二叉树的前序中序和后序遍历算法是学习二叉树必不可少的,若是使用c语言遍历前中后序还是比较繁琐的,因为要考虑遍历结果存放的序列大小问题,想要解决这个问题就得想用递归计算二叉树的节点数量,再调用递归子函数完......
  • leetcode_打卡7
    leetcode_打卡7题目:238.除自身以外数组的乘积思路:代码:classSolution{publicint[]productExceptSelf(int[]nums){intn=nums.length;intsum=1,result=1;intj=0;int[]answer=newint[n];for(inti=0;i<n;i++){......
  • #yyds干货盘点# LeetCode程序员面试金典:两数相除
    题目:给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和取余运算。整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345将被截断为8,-2.7335将被截断至-2。返回被除数 dividend 除以除数 divisor 得到的商。注意:假设我们的......
  • #yyds干货盘点# LeetCode面试题:删除有序数组中的重复项 II
    1.简述:给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。 说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数......
  • DP花园题乱做
    CF837D考虑$f[i][j][cnt2][cnt5]$统计前$i$个数选$j$个,满足有$cnt2$个$2$和$cnt5$个5是否成立。但$f$只存$0$或$1$,考虑$f[i][j][cnt5]=cnt2$,即统计前$i$个数选$j$个,满足$cnt5$个5有都少个$2$。滚动!$f[i][j][k]=max(f[i][j][k],f[i-1][j-1][k-c......
  • LeetCode:Search Algorithm
    LeetCode:SearchAlgorithm1\FirstuniquecharAlgorithmDesign利用字符数量的有限性,通过数组来映射(避免Hash_map的高复杂度)注意数组声明为intA[26]而不是charA[26];if(s=="")return''; intA[26]={0,0}; for(inti=0;i<s.length();i++){ A[s[i]-......