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 ...
随机推荐
- 初识LVS和LVS_NAT
如果一台服务器承受过多的压力,那么服务可能会崩溃,所以,我们应该让一台服务器承受的压力在合理范围内,但是如果服务端必须要承受较大的压力,那么一台服务器可能无法满足我们的要求,所以我们可以使用多台服务器 ...
- SOA架构分析
SOA架构的定义: 面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于 ...
- hive三种调用方式
一.hive -e ‘sql语句’ (shell命令) 适合比较短的sql语句调用,优点是可以直接在shell中调用静音模式 -S 在执行HiveQL过程中,不在显示器输出MR的执行过程hive -S ...
- PHP回顾(4)文件相关函数
touch() 创建文件 (修改时间,不存在时创建) copy() 复制文件,复制过程中可以修改文件名 rename() 重命名 或 移动文件 ...
- [Linux]Ubuntu安装Java详细教程
环境:Ubuntu16.04 桌面版虚拟机 1.下载安装包:jdk-8u231-linux-x64.tar.gz 链接: https://pan.baidu.com/s/1mmtzKejL1Fd_RQ ...
- BZOJ 1923: [Sdoi2010]外星千足虫 高斯消元+bitset
高斯消元求解异或方程组,可以多学一下 $bitset$ 在位运算中的各种神奇操作. #include <cstdio> #include <bitset> #define N ...
- Word:表格在页面中垂直居中
本文适用于Word 2007 + Windows 7,熊猫帮帮主@cnblogs 2018/2/22 如何让表格在页面上垂直居中呢.想当然的认为这属于表格的设置,在表格属性和其它表格相关选项中一通猛找 ...
- luoguP2863 [USACO06JAN]牛的舞会The Cow Prom
P2863 [USACO06JAN]牛的舞会The Cow Prom 123通过 221提交 题目提供者 洛谷OnlineJudge 标签 USACO 2006 云端 难度 普及+/提高 时空限制 1 ...
- 嵌入式实时操作系统VxWorks入门――开发环境构建[转]
VxWorks 操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),它以其良好的可靠性和卓越的实时性被广泛地应用在通 信.军事.航空.航天等高精尖技术及实时性 ...
- Android_(控件)使用ListView显示Android系统中联系人信息
使用ListView显示手机中联系人的姓名和电话号码 父类布局activity_main.xml,子类布局line.xml(一个文件的单独存放) 运行截图: (避免泄露信息对部分地方进行了涂鸦O(∩_ ...