分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程

package live.every.day.ProgrammingDesign.CodingInterviewGuide.Other;/*** 分糖果问题** 【题目】* 一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下:* 1.每个孩子不管得分多少,起码分到1个糖果。* 2.任意两个相邻的孩子之间,得分较多的孩子必须拿多一些的糖果。* 给定一个数组arr代表得分数组,请返回最少需要多少糖果。* 例如:arr=[1,2,2],糖果分配为[1,2,1],即可满足要求且数量最少,所以返回4。** 【进阶问题】* 原题目中的两个规则不变,再加一条规则:* 3.任意两个相邻的孩子之间如果得分一样,糖果数必须相同。* 给定一个数组arr代表得分数组,返回最少需要多少糖果。* 例如:arr=[1,2,2],糖果分配为[1,2,2],即可满足要求且数量最少,所以返回5。** 【要求】* arr长度为N,原题与进阶题都要求时间复杂度为O(N),额外空间复杂度为O(1)。** 【难度】* 困难** 【解答】* 原问题。先引入爬坡和下坡的概念,从左到右依次考虑每个孩子,如果一个孩子的右邻居比他大,那么爬坡过程开始。如果一直单调递* 增,就一直爬坡,否则爬坡结束,下坡开始。如果一直单调递减,就一直下坡,直到遇到一个孩子的右邻居大于或等于他,则下坡结束。* 爬坡中的叫左坡,下坡中的叫右坡。* 比如[1,2,3,2,1],左坡为[1,2,3],右坡为[3,2,1]。比如[1,2,2,1],第一个左坡为[1,2],第一个右坡为[2](只含有第一个* 2),第二个左坡为[2](只含有第二个2),第二个右坡为[2,1]。比如[1,2,3,1,2],第一个左坡[1,2,3],第一个右坡为[3,1],* 第二个左坡为[1,2],第二个右坡为[2]。* 定义了爬坡过程和下坡过程之后,大家可以看到,arr数组可以被分解成很多对左坡和右坡,利用左坡和右坡来看糖果如何分。假设有* 一对左坡和右坡,分别为[1,4,5,9]和[9,3,2]。对左坡来说,从左到右分的糖果应该为[1,2,3,4],对右坡来说,从左到右分的糖* 果应该为[3,2,1]。但这两种分配方式对9这个坡顶的分配是不同的,怎么决定呢?看左坡和右坡的坡度哪个更大,坡度是指坡中除去* 相同的数字之后(也就是纯升序或纯降序)的序列长度。而根据我们定义的爬坡和下坡过程,左坡和右坡中都不可能有重复数字,所以坡* 度就是各自的序列长度。[1,2,3,4]坡度为4,[3,2,1]坡度为3。如果左坡的坡度更大,坡顶就按左坡的分配,如果右坡的坡度更大,* 就按右坡的分配,所以最终分配为[1,2,3,4,2,1]。* 成对的左坡和右坡都按照这种处理方式,从左到右处理得分数组arr,统计总体的糖果数即可。具体过程请参看如下代码中的candy1方* 法。** 进阶问题。针对进阶问题所加的新规则,需要对爬坡和下坡的过程进行修改。从左到右依次考虑每个孩子,如果一个孩子的右邻居大于* 或等于他,那么爬坡过程开始,如果一直不降序,就一直爬坡,否则爬坡结束,下坡开始。如果一直不升序,就一直下坡,直到遇到一* 个孩子的右邻居大于他,则下坡结束。爬坡中的叫左坡,下坡中的叫右坡。比如,[1,2,3,2,1],左坡为[1,2,3],右坡为[3,2,1]。* 再如,[1,2,2,1],左坡为[1,2,2],右坡为[2,1]。* 依然是利用左坡和右坡来决定糖果如何分配,还是举例说明整个分配过程。比如,[0,1,2,3,3,3,2,2,2,2,2,1,1],左坡为* [0,1,2,3,3,3],右坡为[3,2,2,2,2,2,1,1]。对左坡来说,从左到右分的糖果应该为[1,2,3,4,4,4],对右坡来说,从左到右* 分的糖果应该为[3,2,2,2,2,2,1,1]。所以左坡和右坡的分配方案对整个坡顶的分配其实是矛盾的。注意,在这种情況下,其实坡顶* 为3个元素,即[3,3,3]。根据新的规则,相邻的且得分相等的孩子拿的糖果数要一样。所以坡顶究竟按谁的来呢?同样是根据左坡和* 右坡的坡度决定,左坡[0,1,2,3,3,3]的坡度为4,右坡[3,2,2,2,2,2,1,1]的坡度为3,坡顶分的糖果数同样按照坡度大的来决* 定。所以总的分配方案为[1,2,3,4,4,4,2,2,2,2,2,1,1],也就是说,坡顶的所有小朋友都根据坡度大的一方决定。具体过程请参* 看如下代码中的candy2方法。** @author Created by LiveEveryDay*/public class DivideCandyProblem1 {public static int candy1(int[] arr) {if (arr == null || arr.length == 0) {return 0;}int index = nextMinIndex1(arr, 0);int res = rightCands(arr, 0, index++);int leftBase = 1;int next = 0;int rightCands = 0;int rightBase = 0;while (index != arr.length) {if (arr[index] > arr[index - 1]) {res += ++leftBase;index++;} else if (arr[index] < arr[index - 1]) {next = nextMinIndex1(arr, index - 1);rightCands = rightCands(arr, index - 1, next++);rightBase = next - index + 1;res += rightCands + (rightBase > leftBase ? -leftBase : -rightBase);leftBase = 1;index = next;} else {res += 1;leftBase = 1;index++;}}return res;}private static int nextMinIndex1(int[] arr, int start) {for (int i = start; i != arr.length - 1; i++) {if (arr[i] <= arr[i + 1]) {return i;}}return arr.length - 1;}private static int rightCands(int[] arr, int left, int right) {int n = right - left + 1;return n + n * (n - 1) / 2;}public static void main(String[] args) {int[] arr = {1, 2, 2};System.out.printf("The min candy count is: %d", candy1(arr));}}// ------ Output ------
/*
The min candy count is: 4
*/

【困难】分糖果问题-Java:原问题相关推荐

  1. leetcode 575. 分糖果(Java版)

    题目 https://leetcode-cn.com/problems/distribute-candies/ 题解 class Solution {public int distributeCand ...

  2. java 蓝桥杯历届试题 分糖果(题解)

    试题 历届试题 分糖果 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半 ...

  3. java创建一个图形类getv_java建立类和对象分糖果

    10个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩2 ...

  4. 分糖果问题(java)

    10个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩2 ...

  5. 蓝桥杯 历届试题 分糖果(模拟)

    传送门 题目描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半给左手边的孩子. 一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而 ...

  6. 【快乐水题】575. 分糖果

    原题: 力扣链接:575. 分糖果 题目简述: Alice 有 n 枚糖,其中第 i 枚糖的类型为 candyType[i] .Alice 注意到她的体重正在增长,所以前去拜访了一位医生. 医生建议 ...

  7. 58同城笔试题:数组去重;分饼干(分糖果);最小路径和(leetcode64)

    1. 数组去重 题目描述 /*** 有序数组去重* 输出最终的数字个数* 输入:1,2,2* 输出:2* @author Turing**/ 代码 import java.util.*; public ...

  8. 【蓝桥杯】历届试题 分糖果

    历届试题 分糖果   时间限制:1.0s   内存限制:256.0MB 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半给左手边 ...

  9. LeetCode 力扣C++题解 575. 分糖果

    题目描述:给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果.你需要把这些糖果平均分给一个弟弟和一个妹妹.返回妹妹可以获得的最大糖果的种类数.(难度:简单) 原题链接: ...

最新文章

  1. Blender写实产品创作学习教程
  2. Eslint中no-undef的检查报错
  3. Java实现字符全阵列阵列
  4. 基于阿里的Node全栈之路(二)阿里负载均衡的HTTPS优化方案
  5. 盘点海外动力电池巨头 细数日韩锂电设备企业
  6. UVa10795 - A Different Task(递归)
  7. 【Python基础】在pandas中使用pipe()提升代码可读性
  8. 奥鹏教育计算机试题,最新奥鹏教育《计算机基础》模拟试卷附答案(11页)-原创力文档...
  9. linux下的各种shell介绍(bash和dash转换)
  10. DFS-20190206
  11. 分支程序设计02 - 零基础入门学习C语言11
  12. C Primer Plus 第七章 第九题
  13. SegNet 论文解析
  14. 樊登读书会终身成长读后感_樊登读书会《终身成长》读后感
  15. 【小河今学 | Javascript】鼠标拖拽方块运动
  16. re之ida和OllyDbg的使用与代码分析
  17. 计算机电缆能代替控制电缆吗,如何区分:计算机电缆与控制电缆!
  18. 未来人工智能产品的思维,主要有哪几个趋势
  19. 机器学习算法——马尔可夫链蒙特卡罗(MCMC)
  20. c语言编译产生随机数为什么,C语言 怎样产生随机数

热门文章

  1. 5G临时牌照或将发放,商用大幕已经开启
  2. I2C总线接口电路设计
  3. 网络互联技术-实验指导书
  4. 基于simulink对汽车传动系统的振动特性分析
  5. mysql创建用户并设置权限
  6. python里的π怎么输入?
  7. RHRP1560-ASEMI大功率快恢复二极管15A 600V
  8. Windows10设置Google默认浏览器闪退设置失败的解决方法
  9. 深度学习PyTorch(二)卷积神经网络
  10. compare函数c语言,sort(compare)方法