面试题:一个有名的按摩师会收到源源不断的预约请求
拉大锯
发表于
2020-04-25 18:54
1978
算法
java
面试题
javascript
原题目
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
注意:本题相对原题稍作改动
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/the-masseuse-lcci 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思考:
public static int maxAddition(int[] data) {
//如果没人预约,则返回0
if(data.length == 0) {
return 0;
}
//如果一个人预约
if(data.length == 1) {
return data[0];
}
//如果二个人预约
if(data.length == 2) {
return Math.max(data[0],data[1]);
}
//3个以上的情况
//都有拒绝和接受的case
List<Integer> perAdditaion = new ArrayList<>();
//====================================================== i = 0
//第一个拒绝
//==>0
//perAdditaion.add(0);
//第一个接受
//==>1
//perAdditaion.add(data[0]);
//====================================================== i = 1
//1、第一个接受,第二个拒绝
//==>2
//perAdditaion.add(perAdditaion.get(1));
//2、第一个拒绝,第二个拒绝
//==>3
//perAdditaion.add(perAdditaion.get(0));
//3、第一个拒绝,第二个接受
//==>4
//perAdditaion.add(perAdditaion.get(0) + data[1]);
//======================================================= i = 2
//1、第二个接受,第三个拒绝
//==>5
//perAdditaion.add(perAdditaion.get(4));
//2、第二个拒绝,第三个拒绝
//==>6
//perAdditaion.add(Math.max(perAdditaion.get(2),perAdditaion.get(3)));
//2、第二个拒绝,第三个接受
//==>7
//perAdditaion.add(perAdditaion.get(6) + data[2]);
//======================================================= i = 3
//1、第三个接受,第四个拒绝
//==>8
//perAdditaion.add(perAdditaion.get(7));
//2、第三个拒绝,第四个拒绝
//==>9
//perAdditaion.add(Math.max(perAdditaion.get(5),perAdditaion.get(6)));
//3、第三个拒绝,第四个接受
//==>10
//perAdditaion.add(perAdditaion.get(9) + data[3]);
//========================================================= i = 4
//1、第四个接受,第五个拒绝
//==>11
//perAdditaion.add(perAdditaion.get(10));
//2、第四个拒绝,第五个拒绝
//==>12
//perAdditaion.add(Math.max(perAdditaion.get(8),perAdditaion.get(9)));
//3、第四个拒绝,第五个接受
//==>13
//perAdditaion.add(perAdditaion.get(12) + data[4]);
//====================================================== i = ....
//1、第i个接受,第i+1个拒绝
//==> 3*i -1
//perAdditaion.add(perAdditaion.get(3*i-2));
//2、第i个拒绝,第i+1个拒绝
//==> 3*i
//perAdditaion.add(Math.max(perAdditaion.get(3*(i-1)-1),perAdditaion.get(3*(i-1))));
//3、第i个拒绝,第i+1个接受
//==> 3*i+1
//perAdditaion.add(perAdditaion.get(3*i) + data[i]);
// ....
//求出列表的最大值即可
//实现
for(int i = 0; i < data.length; i++) {
if(i == 0) {
//接受
perAdditaion.add(0);
//拒绝
perAdditaion.add(data[0]);
} else if(i == 1) {
//1、第一个接受,第二个拒绝
//==>2
perAdditaion.add(perAdditaion.get(1));
//2、第一个拒绝,第二个拒绝
//==>3
perAdditaion.add(perAdditaion.get(0));
//3、第一个拒绝,第二个接受
//==>4
perAdditaion.add(perAdditaion.get(0) + data[1]);
} else {
//1、第i个接受,第i+1个拒绝
//==> 3*i -1
perAdditaion.add(perAdditaion.get(3 * i - 2));
//2、第i个拒绝,第i+1个拒绝
//==> 3*i
perAdditaion.add(Math.max(perAdditaion.get(3 * (i - 1) - 1),perAdditaion.get(3 * (i - 1))));
//3、第i个拒绝,第i+1个接受
//==> 3*i+1
perAdditaion.add(perAdditaion.get(3 * i) + data[i]);
}
}
Collections.sort(perAdditaion);
Integer mini = perAdditaion.get(0);
Integer max = perAdditaion.get(perAdditaion.size() - 1);
System.out.println("max is === > " + max);
System.out.println("mini is === > " + mini);
return max;
}
java测试代码
class Solution {
public int massage(int[] data) {
//如果人预约,则返回0
if(data.length == 0) {
return 0;
}
if(data.length == 1) {
return data[0];
}
if(data.length == 2) {
return Math.max(data[0],data[1]);
}
//3个以上的情况
//都有拒绝和接受的case
List<Integer> perAdditaion = new ArrayList<>();
//实现
for(int i = 0; i < data.length; i++) {
if(i == 0) {
//接受
perAdditaion.add(0);
//拒绝
perAdditaion.add(data[0]);
} else if(i == 1) {
//1、第一个接受,第二个拒绝
//==>2
perAdditaion.add(perAdditaion.get(1));
//2、第一个拒绝,第二个拒绝
//==>3
perAdditaion.add(perAdditaion.get(0));
//3、第一个拒绝,第二个接受
//==>4
perAdditaion.add(perAdditaion.get(0) + data[1]);
} else {
//第i个
//1、第i个接受,第i+1个拒绝
//==> 3*i -1
perAdditaion.add(perAdditaion.get(3 * i - 2));
//2、第i个拒绝,第i+1个拒绝
//==> 3*i
perAdditaion.add(Math.max(perAdditaion.get(3 * (i - 1) - 1),perAdditaion.get(3 * (i - 1))));
//3、第i个拒绝,第i+1个接受
//==> 3*i+1
perAdditaion.add(perAdditaion.get(3 * i) + data[i]);
}
}
Collections.sort(perAdditaion);
Integer mini = perAdditaion.get(0);
Integer max = perAdditaion.get(perAdditaion.size() - 1);
System.out.println("max is === > " + max);
System.out.println("mini is === > " + mini);
return max;
}
}
Java运行结果
Js测试代码
/**
* @param {number[]} nums
* @return {number}
*/
var massage = function(nums) {
let len = nums.length
//没有客人预约
if(len==0){
return 0
}
//
if(len==1){
return nums[0]
}
if(len==2){
return Math.max(nums[0],nums[1])
}
//3个用户预约以上的case
let perTotal = []
for(let i = 0;i<len;i++){
if(i==0){
//拒绝
perTotal[0] = 0
//接受
perTotal[1] = nums[0]
}else if(i==1){
perTotal[2] = perTotal[1]
perTotal[3] = perTotal[0]
perTotal[4] = perTotal[0]+nums[1]
}else{
perTotal[3*i-1] = perTotal[3*i-2]
perTotal[3*i] =Math.max (perTotal[3 * (i - 1) - 1],perTotal[3 * (i - 1)])
perTotal[3*i+1] = perTotal[3*i] + nums[i]
}
}
let max = 0
for(let j = 0;j<perTotal.length;j++){
let item = perTotal[j]
if(max<item){
max = perTotal[j]
}
console.log('per total -- > ' + item +' index == > ' +j)
}
console.log('max -- > ' + max)
return max;
};