【腾讯云智笔试题——分苹果两种解法】
有m个苹果,n个小孩。每个小孩都有一个编号,小明的编号是。要尽量公平的分苹果,相邻编号的小孩分到的苹果数目差距不能大于1。请问如何在满足相邻编号的小孩分到的苹果数目差距不能大于1的情况下,小明分配到的苹果数目最多,并且输出这个最大值,每个小朋友至少需分配到一个苹果。
·
题目描述
有m个苹果,n个小孩。每个小孩都有一个编号,小明的编号是。要尽量公平的分苹果,相邻编号的小孩分到的苹果数目差距不能大于1。
请问如何在满足相邻编号的小孩分到的苹果数目差距不能大于1的情况下,小明分配到的苹果数目最多,并且输出这个最大值,每个小朋友至少需分配到一个苹果。
输入描述
第一行输入三个整数。
输出描述
输出一行,表示小明分配到苹果个数的最大值。
示例 1
4 6 2
输出
2
说明
可以这样分配1 2 2 1。可以小明分配到了2个苹果。
图片:
解题思路:
首先我这边有两种思路,第一种是暴力时间复杂度是O(m),即苹果越多,时间越长,空间复杂度是O(n),因为根据小孩数量声明的切片,第二种是利用高中数学中通过计算公式得出范围,不同范围内的苹果数是多少,因为全部是计算,不需要for循环所以时间复杂段和空间复杂度都是O(1),第二种思路地址:https://blog.csdn.net/m0_64941684/article/details/139408235?spm=1001.2014.3001.5501
代码奉上:
package main
import (
"fmt"
"os"
)
// 全局数组来存储每个小孩的苹果数,初始化为0
var apples []int
func main() {
var n, m, k int
_, err := fmt.Scanln(&n, &m, &k)
if err != nil {
fmt.Println("Error reading input:", err)
os.Exit(1)
}
// 初始化每个小孩的苹果数为0
apples = make([]int, n)
for i := range apples {
apples[i] = 0
}
result := maxApplesFork(m, n, k-1) // k-1 因为索引从0开始
fmt.Println(result)
}
func maxApplesFork(m, n, k int) int {
if k < 0 || k >= n {
return -1 // 索引越界
}
// 先给每个小孩分配一个苹果
for i := range apples {
apples[i] = 1
}
apples[k]++
// 剩余苹果数
applesLeft := m - n
applesLeft--
// 尝试分配剩余的苹果给小明及其相邻的小孩
for applesLeft > 0 {
if k > 0 && apples[k-1] <= apples[k]-1 {
// 如果小明左边第一个小孩苹果数少于或等于小明苹果数减1,代表不具备小明苹果树+1的条件(条件是两者应该相等)则给小明左边的小孩一个苹果
apples[k-1] = apples[k-1] + 1
applesLeft--
//每次剩余苹果数减一都需要判断是否为0
if applesLeft == 0 {
return apples[k]
}
i := k - 1
//因为小明旁边第一个小孩苹果数+1啦,所以要判断他左边的小孩是否满足相差不超过1的原则,
for i > 0 && apples[i-1] < apples[i]-1 {
apples[i-1] = apples[i] + 1
applesLeft--
if applesLeft == 0 {
return apples[k]
}
if apples[i-1] == apples[i]-1 {
i--
}
}
} else if k < n-1 && apples[k+1] <= apples[k]-1 {
// 如果小明右边的小孩苹果数少于小明苹果数减1,则给小明右边的小孩一个苹果
apples[k+1] = apples[k+1] + 1
applesLeft--
if applesLeft == 0 {
return apples[k]
}
i := k + 1
for i < n-1 && apples[i+1] < apples[i]-1 {
apples[i+1] = apples[i+1] + 1 //asdf
applesLeft--
if applesLeft == 0 {
return apples[k]
}
if apples[i+1] == apples[i]-1 {
i++ //asdf
}
}
} else {
// 否则,给小明一个苹果
apples[k] = apples[k] + 1
applesLeft--
}
}
// 返回小明分到的苹果数
return apples[k]
}
疑惑解析
代码中明明是两个嵌套的for循环时间复杂度为什么是O(m)?
如果有这个疑惑,就代表对时间复杂度理解还是有些不足的,一般情况下时间复杂度是代码中根据数据的量的变化而相应变化,如代码中的每一次循环都会让苹果数-1,所以总的循环次数是与苹果数正相关的。
更多推荐
已为社区贡献2条内容
所有评论(0)