这是小川的第393次更新,第425篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第256题(顺位题号是1103)。我们通过以下方式向一排n = num_people个人分发一些糖果:

给第一个人送1个糖果,给第二个人送2个糖果,依此类推,直到我们给最后一个人送糖果。然后,我们回到行的开头,向第一个人提供n + 1个糖果,向第二个人提供n + 2个糖果,依此类推,直到我们向最后一个人提供2 * n个糖果。

这个过程重复进行,直到我们用完糖果。最后一个人将得到所有剩余的糖果(不一定比之前收到的多)。

返回一个数组(长度为num_people,元素总和为candies),代表糖果的最终分配结果。

例如:

输入:candies = 7,num_people = 4

输出:[1,2,3,1]

说明:

第一次,ans [0] + = 1,数组为[1,0,0,0]。

第二次,ans [1] + = 2,数组是[1,2,0,0]。

第三次,ans [2] + = 3,数组是[1,2,3,0]。

第四次,ans [3] + = 1(因为只剩下一个糖果)。

最后数组是[1,2,3,1]。

输入:candies = 10,num_people = 3

输出:[5,2,3]

说明:

第一次,ans [0] + = 1,数组为[1,0,0]。

第二次,ans [1] + = 2,数组为[1,2,0]。

第三次,ans [2] + = 3,数组为[1,2,3]。

第四次,ans [0] + = 4,最后数组是[5,2,3]。

注意

  • 1 <= candies <= 10^9

  • 1 <= num_people <= 1000

02 第一种解法

暴力解法。

直接使用两层循环,外层控制candies的剩余量,内层循环n次,定义一个变量sum,从1开始自增,代表每次要分出去的糖果数量,内层循环中,每遍历一次,sum加1,同时candies要减去sum,如果最后剩余的糖果小于了本次预计要分配的数量,就将剩余的糖果全给当前这个人,candies为0,循环结束。

public int[] distributeCandies(int candies, int num_people) {
int[] result = new int[num_people];
int sum = 1;
while (candies > 0) {
for (int i=0; i<result.length; i++) {
if (candies - sum> 0) {
result[i] += sum;
candies -= sum;
sum++;
} else {
result[i] += candies;
candies = 0;
break;
}
}
}
return result;
}

03 第二种解法

我们还可以对第一种解法再优化下,变成一层循环,借助取余来实现。

因为每执行一次从头到尾的分配,都是从第一个人到第n个人,可以利用数组的下标对n取余来替代,其他处理逻辑不变。

public int[] distributeCandies2(int candies, int num_people) {
int[] result = new int[num_people];
int sum = 1;
for (int i=0; candies > 0; i++) {
if (candies - sum> 0) {
result[i%num_people] += sum;
candies -= sum;
sum++;
} else {
result[i%num_people] += candies;
break;
}
}
return result;
}

04 第三种解法

我们还可以对第二种解法再优化下,省掉循环方法体里面的if判断。

结果数组的索引是从0开始的,代表第一个人,那他被分配的糖果数量是索引值加1,在前面两种解法中,都使用了if判断candies是不是比当前需要分配出去的糖果大,其实就是取两者之间的较小值。

如果candies剩余的数量比当前需要分配出去的糖果数量大,就可以继续分配;如果candies剩余的数量比当前需要分配出去的糖果数量小,说明当前这次分配时最后一次分配,只能将剩余的糖果数量全部分给当前此人了。

public int[] distributeCandies3(int candies, int num_people) {
int[] result = new int[num_people];
for (int i=0; candies > 0; i++) {
result[i%num_people] += Math.min(candies, i+1);
candies -= i+1;
}
return result;
}

05 小结

算法专题目前已连续日更超过八个月,算法题文章262+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.1103-向人们分发糖果(Distribute Candies to People)的更多相关文章

  1. [Swift]LeetCode575. 分糖果 | Distribute Candies

    Given an integer array with even length, where different numbers in this array represent different k ...

  2. LeetCode 1103. Distribute Candies to People (分糖果 II)

    题目标签:Math 题目让我们分发糖果,分的糖果从1 开始依次增加,直到分完. for loop可以计数糖果的数量,直到糖果发完.但是还是要遍历array 给people 发糖,这里要用到 index ...

  3. LeetCode 1103. Distribute Candies to People

    1103. Distribute Candies to People(分糖果||) 链接:https://leetcode-cn.com/problems/distribute-candies-to- ...

  4. LeetCode:135. 分发糖果

    LeetCode:135. 分发糖果 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分 ...

  5. 【Leetcode_easy】1103. Distribute Candies to People

    problem 1103. Distribute Candies to People solution:没看明白代码... class Solution { public: vector<int ...

  6. [LeetCode] 135. 分发糖果

    题目链接 : https://leetcode-cn.com/problems/candy/ 题目描述: 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分 ...

  7. 【LeetCode】分发糖果

    [问题]老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果.相邻的孩子中 ...

  8. Java实现 LeetCode 135 分发糖果

    135. 分发糖果 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. ...

  9. [Swift]LeetCode135. 分发糖果 | Candy

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

随机推荐

  1. Android Gradle 常用配置

    Gradle:multiDexEnabled之DEX 方法超过64K限制和gradle编译OOM问题解决DEX 方法超过64K限制 UNEXPECTED TOP-LEVEL EXCEPTION: co ...

  2. Parallels Desktop虚拟机无法关机提示“虚拟机处理器已被操作系统重置”

    如果你在使用PD的时候遇到了这样子的弹窗,恭喜你篇博文可以帮助你,因为我刚刚也遇到了这个问题.如果有帮助可以点一下推荐按钮. 针对Windows电脑 启动虚拟机 创建快照 使用管理员权限运行命令提示符 ...

  3. js中for..of..和迭代器

    for..of是ES6中引入的新特性,它主要的作用是:循环一个可迭代的对象. 它可以循环遍历,数组.字符串.Set对象等等 示例一: let str = 'hello' for (item of st ...

  4. 基于c++回顾

    c++类 特别的构造函数 默认参数: 几乎所有函数都可以使用默认参数,但在构造函数中最为普遍 初始化列表 用来直接初始化数据成员;与列表顺序无关,与成员申明顺序有关;如果一个成员是const的,那么, ...

  5. pandas优化

    目录 前言 使用Datetime数据节省时间 pandas数据的循环操作 使用itertuples() 和iterrows() 循环 Pandas的 .apply()方法 矢量化操作:使用.isin( ...

  6. java中如何根据函数查询引用的jar包

    选中函数,按Ctrl+Shift+T,就可以弹出对应的jar包地址 例如:

  7. Fire Game (FZU 2150)(BFS)

    题解:一开始想错了,以为只要烧完就是那个答案,但是这不是最优的结果,需要每两个点都bfs一遍,找到如果能够全部烧完,找到花费时间最小的,如果不能return -1.在bfs的时候,记录答案的方法参考了 ...

  8. Android中的“再按一次返回键退出程序”代码实现

    1 用户在退出应用前给出一个提示是很有必要的,因为可能是用户并不真的想退出,而只是一不小心按下了返回键,大部分应用也是这么做的,但也有些应用的做法是在应用退出去前给出一个Dialog,我觉得这样不太友 ...

  9. Latex中 summation前后距离的设置

    use \hspace ,eg., \hspace{-.1cm} before and after summation to stop violation of margin. 比如下面一段公式代码 ...

  10. 同样的WiFi,手机能连上网,电脑不能。错误代码DNS_PROBE_POSSIBLE

    今天电脑不知打为撒,出了这样个毛病,原因不明.先试着用电脑管家修复,无效.找了网上的很多办法,排除了dns.ip之类的问题.最后在贴吧里看到大神的解决办法,实测简单有效.链接http://tieba. ...