NC刷题笔记12-贪心算法

NC刷题笔记12-贪心算法

本博客文章(学习笔记)导航 (点击这里访问)
在这里插入图片描述

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) {
      // write code here
      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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CandyDingDing

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

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

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

打赏作者

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

抵扣说明:

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

余额充值