Skip to main content

3-16 1431.拥有最多糖果的孩子

Date:2022-03-16 08:11:44

题目:1431.拥有最多糖果的孩子 ( 简单😄 )

给你一个数组 candies 和一个整数 extraCandies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目。

对每一个孩子,检查是否存在一种方案,将额外的 extraCandies 个糖果分配给孩子们之后,此孩子有 最多 的糖果。注意,允许有多个孩子同时拥有 最多 的糖果数目。

示例

示例1:

输入:candies = [2,3,5,1,3], extraCandies = 3
输出:[true,true,true,false,true]
解释:
孩子 12 个糖果,如果他得到所有额外的糖果(3个),那么他总共有 5 个糖果,他将成为拥有最多糖果的孩子。
孩子 23 个糖果,如果他得到至少 2 个额外糖果,那么他将成为拥有最多糖果的孩子。
孩子 35 个糖果,他已经是拥有最多糖果的孩子。
孩子 41 个糖果,即使他得到所有额外的糖果,他也只有 4 个糖果,无法成为拥有糖果最多的孩子。
孩子 53 个糖果,如果他得到至少 2 个额外糖果,那么他将成为拥有最多糖果的孩子。

示例2:

输入:candies = [4,2,1,1,2], extraCandies = 1
输出:[true,false,false,false,false]
解释:只有 1 个额外糖果,所以不管额外糖果给谁,只有孩子 1 可以成为拥有糖果最多的孩子。

示例3:

输入:candies = [12,1,12], extraCandies = 10
输出:[true,false,true]

分析

额,不多说,就是你想的那个解法

思路:先找出最大值,再让每一个孩子加上额外的糖果,如果超过最大值,那么他就是拥有最多糖果的孩子(true)

题解

function kidsWithCandies(candies: number[], extraCandies: number): boolean[] {
const len = candies.length
let max = -Infinity,
ans: boolean[] = []

for (let i = 0; i < len; ++i) {
max = Math.max(max, candies[i])
}

for (let i = 0; i < len; ++i) {
if (candies[i] + extraCandies >= max) {
ans.push(true)
} else {
ans.push(false)
}
}

return ans
}

使用

function main() {
const candies = [2, 3, 5, 1, 3]
const extraCandies = 3

console.log('[]:', kidsWithCandies(candies, extraCandies))
}

main()

3-16-2 64.求 1+2+…+n

Date:2022年03月16日08:49:42

题目:64. 求 1+2+…+n ( 中等😕 )

1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

示例

示例1:

输入: n = 3
输出: 6

示例2:

输入: n = 9
输出: 45

分析

  • 递归

    这里比较容易想到

    时间复杂度为 O(n)

  • 「俄罗斯农民乘法」(较难,暂不做了解)

    时间复杂度为 O(logn)

题解

递归

function sumNums(n: number): number {
// can not use `if`
// if (n <= 0) {
// return 0
// }

// if `0` return `0`, because blocked
return n && n + sumNums(--n)
}

使用

function main() {
// const n = 3
const n = 9

console.log('[]:', sumNums(n))
}

main()