一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
题解:
1.一个预约请求序列
2.不接受相邻的预约
3.找到最优的预约集合使总预约时间最长
示例 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的序列。
-
考虑用另一个数组记录计算过的预约时长,最后从该数组中找最大时长
-
在遍历序列nums[i]时,从count[i-2]位置拿出之前累积的预约时长,求和
-
返回count序列中记录的最大时长
C/C++题解:
class Solution {
public:
int massage(vector<int>& nums) {
int n=nums.size();//vector长度
if(n==0) return 0;//空vector,返回预约时长为0
int count[n];//声明并初始化计数数组
memset(count,0,sizeof(count));
int maxval=0;
for(int i=0;i<n;i++){
if(i>=2)//实现相邻预约时间拒接
maxval=max(count[i-2],maxval);//maxval记录之前累积的预约时长
count[i]=maxval+nums[i];//把下一个可能的预约时间计入总预约时间
}//遍历获取预约总时间最长的那个
maxval=count[0];
for(int i=1;i<n;i++)
maxval = max(maxval,count[i]);
return maxval;}};
Debug结果:
Java题解:
class Solution {
public int massage(int[] nums) {
int n=nums.length;//数组长度
if(n==0) return 0;//空数组,返回预约时长为0
int[] count=new int[n];//声明并初始化计数数组
int maxval=0;
for(int i=0;i<n;i++){
if(i>=2)//实现相邻预约时间拒接
maxval=Math.max(count[i-2],maxval);
count[i]=maxval+nums[i];//把下一个可能的预约时间计入总预约时间
}//遍历获取预约总时间最长的那个
maxval=count[0];
for(int i=1;i<n;i++)
maxval = Math.max(maxval,count[i]);
return maxval;}}
Debug结果:
Python题解:
class Solution(object):
def massage(self, nums):
""":type nums: List[int]:rtype: int"""
n=len(nums) #列表长度
if n==0: return 0#空列表,返回预约时长为0
count=[] #声明并初始化计数列表
maxval=0
for i in range(n):
if i>=2: #实现相邻预约时间拒接
maxval=max(count[i-2],maxval)
count.append(maxval+nums[i]) #把下一个可能的预约时间计入总预约时间
#返回预约总时间最长的那个
return max(count)
Debug结果:
例题来自力扣网https://leetcode-cn.com/