面试题-17.16 按摩师

力扣题目

解题思路

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。

解题思路:

1. 确定状态:每次可以选择接待或不接待一位客户。因此,可以使用一个二维数组dp来表示当前到第i位客户时的最长预约时长。dp[i][0]表示不接待第i位客户时的最长预约时长,dp[i][1]表示接待第i位客户时的最长预约时长。

2. 初始状态:初始化dp[0][0]为0,表示第一个客户不接待时的预约时长为0,dp[0][1]为nums[0],表示第一个客户接待时的预约时长为nums[0]。

3. 状态转移方程:根据当前状态的不同选择(接待或不接待),更新下一状态的预约时长。对于第i位客户,如果选择不接待,则当前状态的最长预约时长为前一位客户接待和不接待两种状态中的最大值;如果选择接待,则当前状态的最长预约时长为前一位不接待的状态加上当前客户的预约时长。

4. 最终结果:遍历所有客户后,最终的最长预约时长为dp[len-1][0]和dp[len-1][1]中的较大值,即最后一位客户接待和不接待两种状态下的最长预约时长。
 

java代码:

package org.example;

public class M1716 {
    public static void main(String[] args) {
        M1716 a = new M1716();
        System.out.println(a.massage(new int[]{2,1,4,5,3,1,1,3}));
    }

    public int massage(int[] nums) {
        int len = nums.length;
        if (len == 0 || len == 1) {
            return len == 0 ? 0 : nums[0];
        }
        int[][] dp = new int[len][2];
        // 初始值
        dp[0][0] = 0; // 第一个客户不接
        dp[0][1] = nums[0]; // 第一个客户接
        for (int i = 1; i < len; i++) {
            // 如果第i个客户不接
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);
            // 如果第i个客户接了
            dp[i][1] = dp[i - 1][0] + nums[i];
        }
        // 最终返回最长预约时长
        return Math.max(dp[len - 1][0], dp[len - 1][1]);
    }
}

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L.2626

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值