一维动态规划经典力扣题目(一)

这篇具有很好参考价值的文章主要介绍了一维动态规划经典力扣题目(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

题一:斐波那契数列

题目二:最低票价

题三:解码方法

题一:斐波那契数列

一维动态规划经典力扣题目(一),动态规划,leetcode,算法

递归方法是2的n次方的时间复杂度。

递归代码:

package DynaticPractice;

public class Problem1 {
    public static void main(String[] args) {
        System.out.println(fib(5));
    }
    public static int fib(int n){
        if(n==0) return 0;
        if(n==1) return 1;
        return fib(n-1)+fib(n-2);
    }
}

带有缓存的递归,会使时间复杂度得到大幅度优化。

时间复杂度为O(n)。

缓存即记录中间值

/**
 * 带有缓存的解法 * 时间复杂度为O(n) 
 */
 public static int fib2(int n){
    int[] dp=new int[n+1];
    Arrays.fill(dp,-1);
    return f2(n,dp);
}
public static int f2(int i,int[] dp){
    if(i==0){
        return 0;
    }
    if(i==1){
        return 1;
    }
    if(dp[i]!=-1){
        return dp[i];
    }
    int ans=f2(i-1,dp)+f2(i-2,dp);
    dp[i]=ans;
    return ans;
}

        优化的方法:

/**
 * 从底到顶计算的方法 
 */
public static int fib3(int n){
    if(n==0) return 0;
    if(n==1) return 1;
    int[] dp=new int[n+1];
    dp[1]=1;
    for(int i=2;i<=n;i++){
        dp[i]=dp[i-1]+dp[i-2];
    }
    return dp[n];
}
/**
 * 空间简化的从底向顶的计算 
 */
public static int fib4(int n){
    if(n==0) return 0;
    if(n==1) return 1;
    int LastLast=0;
    int Last=1;
    for(int i=2,cur;i<=n;i++){
        cur=Last+LastLast;
        LastLast=Last;
        Last=cur;
    }
    return Last;
}

一维动态规划经典力扣题目(一),动态规划,leetcode,算法

题目二:最低票价

一维动态规划经典力扣题目(一),动态规划,leetcode,算法

        代码:

package DynaticPractice;

import java.util.Arrays;

public class Problem2 {
    //步骤数组,方案数组    
    public static int[] durations={1,7,30};

    /**    
     * 方法一:暴力尝试     
     */    
     public static int mincostTickets1(int[] days,int[] costs){
        return f1(days,costs,0);
    }
    //从第i下标的天开始,最少花费多少    
    public static int f1(int[] days,int[] costs,int i){
        if(i==days.length){//后续没有了            
            return 0;
        }
        int ans=Integer.MAX_VALUE;
        for(int k=0,j=i;k<3;k++){//遍历方案            
        while (j<days.length && days[i]+durations[k]>days[j]){
                j++;
            }
            ans=Math.min(ans,costs[k]+f1(days,costs,j));
        }
        return ans;
    }

    /**    
     * 带有缓存的递归     
     * 动态规划     
     */    
     public static int mincostTickets2(int[] days,int[] costs){
        int[] dp=new int[days.length];//dp数组中的元素值代表从该位置开始的最小费用        
        Arrays.fill(dp,Integer.MAX_VALUE);
        return f2(days,costs,0,dp);
    }
    public static int f2(int[] days,int[] costs,int i,int[] dp){
        if(i==days.length){//后续没有了            
            return 0;
        }
        if(dp[i]!=Integer.MAX_VALUE){
            return dp[i];
        }
        int ans=Integer.MAX_VALUE;
        for(int k=0,j=i;k<3;k++){//遍历方案            
            while (j<days.length && days[i]+durations[k]>days[j]){
                j++;
            }
            ans=Math.min(ans,costs[k]+f2(days,costs,j,dp));
        }
        dp[i]=ans;
        return ans;
    }

    /**    
     * 非递归方式     
     * 从底到顶的动态规划     
     */    
    public static int MAXN=366;
    public static int[] dp=new int[MAXN];
    public static int mincostTickets3(int[] days,int[] costs){
        int n=days.length;
        Arrays.fill(dp,0,n+1,Integer.MAX_VALUE);
        dp[n]=0;
        for(int i=n-1;i>=0;i--){
            for(int k=0,j=i;k<3;k++){
                while (j<days.length && days[i]+durations[k]>days[j]){
                    j++;
                }
                dp[i]=Math.min(dp[i],costs[k]+dp[j]);
            }
        }
        return dp[0];
    }
}

题三:解码方法

一维动态规划经典力扣题目(一),动态规划,leetcode,算法

        代码:文章来源地址https://www.toymoban.com/news/detail-831880.html

package DynaticPractice;

import java.util.Arrays;

public class Problem3 {

    /**    
     * 方法一     
     * @param s     
     * @return     
     */    
    public static int numDecodings(String s){
        return f1(s.toCharArray(),0);
    }

    private static int f1(char[] s, int i) {
        if(i==s.length){
            return 1;
        }
        int ans;
        if(s[i]=='0'){
            ans=0;
        }else {
            ans=f1(s,i+1);//自己单独一个字符的情况            
            if(i+1<s.length && ((s[i]-'0')*10+(s[i+1]-'0'))<=26){//两个字符的情况                
                ans+=f1(s,i+2);
            }
        }
        return ans;
    }


    /**    
     * 方法二     
     */    
    public static int numDecodings2(String s){
        int[] dp=new int[s.length()];
        Arrays.fill(dp,-1);
        return f2(s.toCharArray(),0,dp);
    }
    private static int f2(char[] s, int i,int[] dp){
        if(i==s.length){
            return 1;
        }
        if(dp[i]!=-1){
            return dp[i];
        }
        int ans;
        if(s[i]=='0'){
            ans=0;
        }else {
            ans=f2(s,i+1,dp);//自己单独一个字符的情况            
            if(i+1<s.length && ((s[i]-'0')*10+(s[i+1]-'0'))<=26){//两个字符的情况                
                ans+=f2(s,i+2,dp);
            }
        }
        dp[i]=ans;
        return ans;
    }
    /**    
     * 方法三     
     * 从底到顶     
     */    
    public static int numDecodings3(String s){
        char[] charArray = s.toCharArray();
        int n=charArray.length;
        int[] dp=new int[n+1];
        dp[n]=1;
        for(int i=n-1;i>=0;i--){
            if(charArray[i]=='0'){
                dp[i]=0;
            }else{
                dp[i]=dp[i+1];
                if(i+1<charArray.length && ((charArray[i]-'0')*10+(charArray[i+1]-'0'))<=26){//两个字符的情况                    
                    dp[i]+=dp[i+2];
                }
            }
        }
        return dp[0];
    }
}

到了这里,关于一维动态规划经典力扣题目(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • class066 一维动态规划【算法】

    算法讲解066【必备】从递归入手一维动态规划 // 斐波那契数 // 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 // 该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。 // 也就是:F(0) = 0,F(1) = 1 // F(n) = F(n - 1) + F(n - 2),其中 n 1 // 给定 n ,请计算

    2024年02月04日
    浏览(26)
  • 【LeetCode动态规划#06】分割等和子集(01背包问题一维写法实战)

    分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums = [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11] 示例 2: 输入:nums = [1,2,3,5] 输出:false 解释:数组不能分割

    2023年04月09日
    浏览(45)
  • 【LeetCode】动态规划类题目详解

    所有题目均来自于LeetCode,刷题代码使用的Python3版本 如果某一个问题有重叠的子问题,则使用动态规划进行求解是最有效的。 动态规划中每一个状态一定是由上一个状态推导出来的,这一点区别于贪心算法 动态规划五部曲 确定dp数组以及下标的含义 确定递推公式 dp数组如何

    2024年04月11日
    浏览(35)
  • 【LeetCode动态规划#07】01背包问题一维写法(状态压缩)实战,其二(目标和、零一和)

    力扣题目链接(opens new window) 难度:中等 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。 返回可以使最终数组和为目标数 S 的所有添加符号的方法数。 示例: 输入

    2023年04月18日
    浏览(38)
  • 算法修炼之路之双指针含多道leetcode 经典题目

    目录 前言  一:普通双指针 1.经典题目一  283移动0问题 分析 代码实现 2.经典题目二 1089复写0  分析 代码实现 二:解决成环类问题-快慢指针  经典例题一 202快乐数 分析  代码实现   三:左右相遇指针 经典例题一 11 盛最多水的容器 分析  代码实现    接下来的日子会顺

    2024年04月13日
    浏览(61)
  • 【算法】——动态规划题目讲解

    本期继续为大家带来的是关于动态规划类题目的讲解,对于这类题目大家一定要多加练习,争取掌握。 链接如下: 62. 不同路径 题目如下: 算法思路: 1. 状态表⽰:  对于这种「路径类」的问题,我们的状态表⽰⼀般有两种形式: i. 从 [i, j] 位置出发; ii. 从起始位置出发

    2024年02月10日
    浏览(25)
  • 【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人

    《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌ 更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍 感谢小伙伴 们点赞、关注! class   Solution :      def   findContentChildren ( self ,  g :  List [ int ],  s

    2024年02月04日
    浏览(39)
  • 【每日易题】Leetcode上Hard难度的动态规划题目——地下城游戏的实现

    君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,博主最近一直在钻研动态规划算法,最近在Leetcode上刷题的时候遇到一个Hard难度的动态规划题,今天就借此机会来给大家分享一下我对这个题目的一些看法和解题思路(放心,

    2024年02月05日
    浏览(31)
  • C++算法之动态规划(ACWING题目)

    动态规划时间复杂度:状态数量*转移计算量 线性DP 一.数字三角形 动态规划:     1.状态表示:         集合:f[i, j]表示所有从起点走到(i, j)的路径         属性:所有路径上的数字之和的最大值     2.状态计算:         如何得到f[i, j]?             从左边路径走到和

    2024年02月20日
    浏览(27)
  • 【数据结构】回溯算法公式化解题 leetcode经典题目带刷:全排列、组合、子集

    一、什么是回溯算法 回溯算法(Backtracking Algorithm)是一种解决 组合问题 、 排列问题 、 选择问题 等一类问题的常用算法。它通过尝试所有可能的选择来找到问题的解,当发现当前选择不符合要求时,就回溯到之前的状态,然后尝试其他的选择。 1、基本思想: 从问题的起

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包