【每日算法Day 1】六一到了,力扣官方发糖
Wallace Xu 2020-06-01 数组
# 题目链接
LeetCode 1431. 拥有最多糖果的孩子 (opens new window)
# 题目描述
给你一个数组 candies 和一个整数 extraCandies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目。
对每一个孩子,检查是否存在一种方案,将额外的 extraCandies 个糖果分配给孩子们之后,此孩子有 最多 的糖果。注意,允许有多个孩子同时拥有最多的糖果数目。
# 示例
输入:candies = [2,3,5,1,3], extraCandies = 3
输出:[true,true,true,false,true]
解释:
孩子 1 有 2 个糖果,如果他得到所有额外的糖果(3个),那么他总共有 5 个糖果,他将成为拥有最多糖果的孩子。
孩子 2 有 3 个糖果,如果他得到至少 2 个额外糖果,那么他将成为拥有最多糖果的孩子。
孩子 3 有 5 个糖果,他已经是拥有最多糖果的孩子。
孩子 4 有 1 个糖果,即使他得到所有额外的糖果,他也只有 4 个糖果,无法成为拥有糖果最多的孩子。
孩子 5 有 3 个糖果,如果他得到至少 2 个额外糖果,那么他将成为拥有最多糖果的孩子。
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 解题思路
遍历数组找到最大值maxCandies,然后再遍历一次,对于每个孩子i,如果candies[i]+extraCandies>=maxCandies,则输出true。时间复杂度为O(n),空间复杂度为O(1)。
public List<Boolean> kidsWithCandies(int[] candies, int extraCandies) {
if (candies==null||candies.length<1||extraCandies<0) return null;
List<Boolean> list=new ArrayList<>();
int maxCandies=0;
for (int candie : candies) {
if (candie>maxCandies)
maxCandies=candie;
}
maxCandies-=extraCandies;//省去后面每次比较中都要做一次加法
for (int candie : candies) {
list.add(candie >= maxCandies);
}
return list;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 总结
之前刷LeetCode都不是很规律系统,今天是正式开始自学Routine的第一天。做的时候还纳闷是不是有什么陷阱,时间复杂度为O(n)能不能再提升,但是数组没有规律。看了题解一开始就没考虑O(n^2)的算法,没想到今天的每日一题官方送糖果,希望是个好的开头吧。