Leetcode算法题-动态规划

面试题 08.11. 硬币

https://leetcode-cn.com/problems/coin-lcci/

class Solution {
    public int waysToChange(int n) {
        int[] nums = {1,5,10,25};
        long[][] dp = new long[5][n + 1];
        for (int i = 0; i < 4; i++) {
            dp[i][0] = 1; 
            for (int j = 0; j <= n; j++) {
                if (j >= nums[i]) dp[i + 1][j] = dp[i][j] + dp[i + 1][j - nums[i]];
                else dp[i + 1][j] = dp[i][j];
            }
        }
        return (int) (dp[4][n] % 1000000007);
    }
}

面试题 16.17. 连续数列

https://leetcode-cn.com/problems/contiguous-sequence-lcci/

//方法1动态规划: f(x) = Math.max(f(i - 1) + nums[i], nums[i])
    public int maxSubArray2(int[] nums) {
        int pre = 0, ans = nums[0];
        for (int num : nums) {
            pre = Math.max(num,pre + num);
            ans = Math.max(ans, pre);
        }
        return ans;
    }


//方法2 分治思想:
    public class Status{
        public int lSum, rSum, mSum, aSum;
        public Status(int lSum, int rSum, int mSum, int aSum) {
            this.lSum = lSum;
            this.rSum = rSum;
            this.mSum = mSum;
            this.aSum = aSum;
        }
    }

    public int maxSubArray(int[] nums) {
        return getMax(nums, 0, nums.length - 1).mSum;
    }
    public Status getMax(int[] arr, int L, int R) {
        if (L == R) {
            return new Status(arr[L], arr[L], arr[L], arr[L]);
        }
        int m = (L + R) >> 1;
        Status lSub = getMax(arr, L, m);
        Status rSub = getMax(arr, m + 1, R);
        return getMax(lSub, rSub);
    }

    public Status getMax(Status lSub, Status rSub) {
        int lSum = Math.max(lSub.lSum,lSub.aSum + rSub.lSum);
        int rSum = Math.max(rSub.rSum, rSub.aSum + lSub.rSum);
        int mSum = Math.max(lSub.rSum + rSub.lSum,Math.max(lSub.mSum, rSub.mSum));
        int aSum = lSub.aSum + rSub.aSum;
        return new Status(lSum,rSum,mSum,aSum);
    }

面试题 17.16. 按摩师

https://leetcode-cn.com/problems/the-masseuse-lcci/

public int massage(int[] nums) {
        int n = nums.length;
        if (nums == null || n == 0) return 0;
        int[][] dp = new int[n][2];
        dp[0][1] = nums[0];
        for (int i = 1; i < n; i++) {
            dp[i][0] = Math.max(dp[i - 1][0],dp[i - 1][1]);
            dp[i][1] = dp[i - 1][0] + nums[i];
        }
        return Math.max(dp[n - 1][0],dp[n - 1][1]);
    }

    public int massage2(int[] nums) {
        int n = nums.length;
        if (nums == null || n == 0) return 0;
        int dp0 = 0, dp1 = nums[0];
        for (int i = 1; i < n; i++) {
            int temp0 = Math.max(dp0,dp1);
            dp1 = dp0 + nums[i];
            dp0 = temp0;
        }
        return Math.max(dp0,dp1);
    }

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值