leetcode【每日一题】按摩师 Java

题干

一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。

注意:本题相对原题稍作改动

示例 1:

输入: [1,2,3,1]
输出: 4
解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4

示例 2:

输入: [2,7,9,3,1]
输出: 12
解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2 + 9 + 1 = 12

示例 3:

输入: [2,1,4,5,3,1,1,3]
输出: 12
解释: 选择 1 号预约、 3 号预约、 5 号预约和 8 号预约,总时长 = 2 + 4 + 3 + 3 = 12

想法

这道题有点像之前做过的打家劫舍

看了题干以后发现要么暴力遍历要么动态规划
设dp[i]表示前i个预约的最长时间,但是这里就发现了 现在的预约时间是由之前的预约时间和i-1是否接受了预约,
于是还要再表示一下是否接受了预约,于是用dp[i][0]表示i没有接受预约,dp[i][1]表示接受了预约。
如果dp[i]时没有接受这个预约,那么上一次可以接受也可以不接受,也就是
dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
如果dp[i]接受了这个预约,那么上一次必须没有预约
于是dp[i][1]=dp[i-1][0]+nums[i];
遍历一遍最后返回
max(dp[nums.length-1][1],dp[nums.length-1][0]);即可

Java代码

import java.util.Arrays;

public class Massage {
    public int massage(int[] nums) {
        //空判断
        if(nums==null||nums.length==0){
            return  0;
        }
        //就一个的话最大就是它
        if(nums.length==1){
            return  nums[0];
        }
        //dp[i]表示前i个预约的最长时间,dp[i][0]表示i没有接受预约,dp[i][1]表示接受了预约
        int[][] dp=new int[nums.length][2];
        dp[0][0]=0;
        dp[0][1]=nums[0];
        for (int i=1;i<nums.length;i++){
            //如果dp[i]时没有接受这个预约,那么上一次可以接受也可以不接受
            dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]);
            //如果dp[i]接受了这个预约,那么上一次必须没有预约
            dp[i][1]=dp[i-1][0]+nums[i];

        }
        return Math.max(dp[nums.length-1][1],dp[nums.length-1][0]);

    }
    public  static  void main(String [] args){
        Massage massage =new Massage();
        int [] test1={1,2,3,1};
        int [] test2={2,7,9,3,1};
        System.out.println(Arrays.toString(test1));
        System.out.println(massage.massage(test1));
        System.out.println(Arrays.toString(test2));
        System.out.println(massage.massage(test2));

    }
}

我的leetcode代码都已经上传到我的git

发布了180 篇原创文章 · 获赞 0 · 访问量 3783

猜你喜欢

转载自blog.csdn.net/qq_43491066/article/details/105068854