LeetCode.1103-向人们分发糖果(Distribute Candies to People)
这是小川的第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)的更多相关文章
- [Swift]LeetCode575. 分糖果 | Distribute Candies
Given an integer array with even length, where different numbers in this array represent different k ...
- LeetCode 1103. Distribute Candies to People (分糖果 II)
题目标签:Math 题目让我们分发糖果,分的糖果从1 开始依次增加,直到分完. for loop可以计数糖果的数量,直到糖果发完.但是还是要遍历array 给people 发糖,这里要用到 index ...
- LeetCode 1103. Distribute Candies to People
1103. Distribute Candies to People(分糖果||) 链接:https://leetcode-cn.com/problems/distribute-candies-to- ...
- LeetCode:135. 分发糖果
LeetCode:135. 分发糖果 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分 ...
- 【Leetcode_easy】1103. Distribute Candies to People
problem 1103. Distribute Candies to People solution:没看明白代码... class Solution { public: vector<int ...
- [LeetCode] 135. 分发糖果
题目链接 : https://leetcode-cn.com/problems/candy/ 题目描述: 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分 ...
- 【LeetCode】分发糖果
[问题]老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果.相邻的孩子中 ...
- Java实现 LeetCode 135 分发糖果
135. 分发糖果 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. ...
- [Swift]LeetCode135. 分发糖果 | Candy
There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...
随机推荐
- BZOJ2238 Mst[最小生成树+树剖+线段树]
跑一遍mst.对于非mst上的边,显然删掉不影响. 如果删边在树上,相当于这时剩下两个连通块.可以证明要重新构成mst只需要再加一条连接两个连通块的最小边,不会证,yy一下,因为原来连通块连的边权和已 ...
- Python numpy.ZIP 安装问题
今天在python上安装numpy,按照网上教程,安装pip,然后命令行直接:pip install numpy .但是一直因为资源问题下载失败. 后来下载了一个numpy-1.11.2.zip 安 ...
- mongodb 批量添加、修改和删除
1.使用MongoTemplate a.批量插入 Insert a Collection of objects into a collection in a single batch write to ...
- js中彻底删除对象属性
delete运算符可以删除对象的属性,但是仅仅是断开了属性和宿主对象的联系,而不会去操作被删除属性的属性值,所以就需要彻底删除的出现 function myDelete(obj,propertyNam ...
- BZOJ 3143: [Hnoi2013]游走 概率与期望+高斯消元
Description 一个无向连通图,顶点从1编号到N,边从1编号到M.小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获 ...
- luogu 1593 因子和 约数+线性筛
等比数列那里忘判项数等于 $1$ 的情况了. Code: #include <cstdio> #include <vector> #include <algorithm& ...
- 2018 南京预选赛 J Sum ( 欧拉素数筛 、Square-free Number、DP )
题目链接 题意 : 定义不能被平方数整除的数为 Square-free Number 定义 F(i) = 有几对不同的 a 和 b 使得 i = a * b 且 a .b 都是 Square-free ...
- python测试网站访问速度
# -*- coding: utf-8 -*- # @Author : Felix Wang # @time : 2018/8/13 22:13 # pip3 install pycurl impor ...
- CUDA-F-2-1-CUDA编程模型概述2
Abstract: 本文继续上文介绍CUDA编程模型关于核函数以及错误处理部分 Keywords: CUDA核函数,CUDA错误处理 开篇废话 今天的废话就是人的性格一旦形成,那么就会成为最大的指向标 ...
- ValueError: Cannot assign "\<QuerySet [<Area: China>]\>": "Area.parent" must be a "Area" instance.
在研究才Django自关联的过程中,在插入数据时爆出如下错误: ValueError: Cannot assign "<QuerySet [<Area: China>]&g ...