本博客文章(学习笔记)导航 (点击这里访问)
BM95 分糖果问题
描述
一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:
1. 每个孩子不管得分多少,起码分到一个糖果。
2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)
给定一个数组 arr 代表得分数组,请返回最少需要多少糖果。
要求: 时间复杂度为 O(n) 空间复杂度为 O(n)
数据范围:1≤n≤100000 ,1≤ai≤1000
示例1
输入:[1,1,2]
返回值:4
说明:最优分配方案为1,1,2
示例2
输入:[1,1,1]
返回值:3
说明:最优分配方案是1,1,1
思路1:
所有孩子的糖果数初始化为 1;
先从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的 糖果数加 1;
再从右往左遍历一遍,如果左边孩子的评分比右边的高,且左边孩子当前的糖果数不大于右边孩子的糖果数,
则左边孩子的糖果数更新为右边孩子的糖果数加 1。
通过这两次遍历, 分配的糖果就可以满足题目要求了
时间复杂度:O(n) 空间复杂度:O(n)
思路2:
import java.util.*;
public class Solution {
public int candy (int[] arr) {
int[] tmp= new int[arr.length];
Arrays.fill(tmp,1);
int count=0;
for(int i=1;i<arr.length;i++){
if(arr[i]>arr[i-1]){
tmp[i]=tmp[i-1]+1;
}
}
for(int i=arr.length-1;i>0;i--){
if(arr[i-1]>arr[i]){
tmp[i-1]=Math.max(tmp[i-1],tmp[i]+1);
}
}
for(int i:tmp) count+=i;
return count;
}
}
BM96 主持人调度
描述
有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是 starti ,第 i 个活动的结束时间是 endi ,举办某个活动就需要为该活动准备一个活动主持人。
一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 (starti,endi) 这个时间段不能参与其他任何活动。求为了成功举办这 n 个活动,最少需要多少名主持人。
数据范围: 1≤n≤10^5, -2^32<start_i,end_i<2^31-1
复杂度要求:时间复杂度O(nlogn) ,空间复杂度O(n)
示例1
输入:2,[[1,2],[2,3]]
返回值:1
说明:只需要一个主持人就能成功举办这两个活动
示例2
输入:2,[[1,3],[2,4]]
返回值:2
说明:需要两个主持人才能成功举办这两个活动
备注: 1≤n≤10^5 start_i,end_i在int范围内
思路:
区间排序 + 小顶堆
前面的主持人是否能抽出空,就看小顶堆第一个区间结束的时间是否小于等于当前活动的开始时间
import java.util.*;
public class Solution {
public int minmumNumberOfHost (int n, int[][] startEnd) {
Arrays.sort(startEnd, new Comparator<int[]>(){
@Override
public int compare(int[] task1, int[] task2){
if(task1[0] != task2[0]){
return task1[0] < task2[0]? -1: 1;
}else{
return task1[1] < task2[1]? -1: 1;
}
}
});
PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(startEnd[0][1]);
for(int i = 1; i < n; i++){
if(startEnd[i][0] >= pq.peek()){
pq.poll();
}
pq.offer(startEnd[i][1]);
}
return pq.size();
}
}