牛客在线编程之贪心算法

题目一

题目描述

一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:

1. 每个孩子不管得分多少,起码分到一个糖果。

2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。(若相同则无此限制)

给定一个数组 arr 代表得分数组,请返回最少需要多少糖果。

解题思路

这个题目使用贪心算法

我们主要要做的就是保证两个数据之间如果有数据差的就需要改变糖果数量

首先给每个地方的糖果值都赋值为1

我们从前面往后面扫描,如果下一个大于前一个,我们就需要在前面一个的基础上给后面的加一;然后再从后面往前面扫描,如果前面一个大于后面一个,如果左边在上一轮中分到的糖果数更小,则更新为右边的糖果数+1,否则保持不变。

代码展示

import java.util.*;
public class Solution {
    public int candy (int[] arr) {
        int n = arr.length;
        if (n <= 1)
            return n;
        int[] nums = new int[n];
        //初始化
        for (int i = 0; i < n; i++)
            nums[i] = 1;
        //从左到右遍历
        for (int i = 1; i < arr.length; i++) {
            //如果右边在递增,每次增加一个
            if (arr[i] > arr[i - 1])
                nums[i] = nums[i - 1] + 1;
        }
        //记录总糖果数
        int res = nums[arr.length - 1];
        //从右到左遍历
        for (int i = arr.length - 2; i >= 0; i--) {
            //如果左边更大但是糖果数更小
            if (arr[i] > arr[i + 1] && nums[i] <= nums[i + 1])
                nums[i] = nums[i + 1] + 1;
            //累加和
            res += nums[i];
        }
        return res;
    }
}

题目二 主持人调度

题目描述

有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是 starti ,第 i 个活动的结束时间是 endi ,举办某个活动就需要为该活动准备一个活动主持人。

一位活动主持人在同一时间只能参与一个活动。并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 (starti,endi) 这个时间段不能参与其他任何活动。求为了成功举办这 n 个活动,最少需要多少名主持人。

解题思路

// write code here

首先我们要明确的就是,我们活动中的开始时间一定不会大于结束时间,所以就算我们使用排序对活动开始和结束分别进行排序也不会有影响  因为我们要找的就是开始时间大于某一个结束时间的,所以我们只要找到了开始时间大于结束时间就可以

当找到一个将结束时间往后移就可以,并不会造成影响

最后我们就可以找到我们需要几个主持人

代码展示

import java.util.*;
public class Solution {
    public int minmumNumberOfHost (int n, int[][] startEnd) {
        int[] start = new int[n];
        int[] end = new int[n];
        //分别得到活动起始时间
        for (int i = 0; i < n; i++) {
            start[i] = startEnd[i][0];
            end[i] = startEnd[i][1];
        }
        //单独排序
        Arrays.sort(start, 0, start.length);
        Arrays.sort(end, 0, end.length);
        int res = 0;
        int j = 0;
        for (int i = 0; i < n; i++) {
            //新开始的节目大于上一轮结束的时间,主持人不变
            if (start[i] >= end[j])
                j++;
            else
                //主持人增加
                res++;
        }
        return res;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值