<>95 分糖果问题
思路非常简单,和题解一模一样:
用数组存每个人对应的糖果数量,初始为1
* 从左到右遍历,如果比左边的大,+1
* 再从右到左遍历,如果比右边的大,+1 import java.util.*; public class Solution { /** * pick
candy * @param arr int整型一维数组 the array * @return int整型 */ public int candy (int[
] arr) { // write code here //03 22 int res=0; int[] dp = new int[arr.length];
Arrays.fill(dp,1); //从左到右遍历 for(int i=1;i<arr.length;i++){ //如果本来就更大就不用+ if(arr[
i]>arr[i-1]&&dp[i]<=dp[i-1]){ dp[i]=dp[i-1]+1; } } //从右到左遍历 for(int i=arr.length
-2;i>=0;i--){ if(arr[i]>arr[i+1]&&dp[i]<=dp[i+1]){ dp[i]=dp[i+1]+1; } } for(int
i=0;i<arr.length;i++){ res+=dp[i]; } return res; } }
<>96 主持人调度
!!!!!!!!!!!!!!!这题debug了很久很久,最后自己的想法也没过(问题应该在我的做法只排序了开始时间,没有排序结束时间),还是看了题解
第一个点是数据范围的问题,用Integer重写的比较器不能用减法返回,否则用减法会超出数据范围,导致错误结果,可以用if判断大小再返回
重载+小顶堆
具体做法:
step 1:重载sort函数,将开始时间早的活动放在前面,相同情况下再考虑结束时间较早的。
step 2:使用小顶堆辅助,其中堆顶是还未结束的将要最快结束的活动的结束时间。
step 3:首先将int的最小数加入堆中,遍历每一个开始时间,若是堆顶的结束时间小于当前开始时间,可以将其弹出,说明少需要一个主持人。
step 4:除此之外,每次都需要将当前的结束时间需要加入堆中,代表需要一个主持人,最后遍历完成,堆中还有多少元素,就需要多少主持人。
import java.util.*; public class Solution { /** *
代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算成功举办活动需要多少名主持人 * @param n int整型 有n个活动
* @param startEnd int整型二维数组
startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间 * @return int整型 */
public int minmumNumberOfHost (int n, int[][] startEnd) { // write code here
//按开始时间递增排 Arrays.sort(startEnd,new Comparator<Object>(){ public int compare(
Object o1,Object o2){ int[] one = (int[]) o1; int[] two = (int[]) o2; if(one[0]>
two[0]) return 1; else if(one[0]==two[0]) return 0; else return -1;
//注意这里不能直接返回one[0]-two[0]!!!! } }); //小顶堆 PriorityQueue<Integer> q = new
PriorityQueue<Integer>(); q.offer(Integer.MIN_VALUE); for(int i=0;i<n;i++){
//最近的活动结束时间小于当前活动开始时间 if(q.peek()<=startEnd[i][0]) q.poll(); q.offer(startEnd[i]
[1]); } //剩余的活动等于主持人数 return q.size(); } }
优先队列插入的时间复杂度是O(logn),
时间复杂度:O(nlog2n)
sort排序是O(nlog2n),一次遍历,循环中维护堆每次O(log2n)
空间复杂度:O(n),堆大小最大为n