文章目录
- 题目描述
- 解题思路:
- 疑惑解析
- 代码中明明是两个嵌套的for循环时间复杂度为什么是O(m)?
题目描述
有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 mainimport ("fmt""os"
)// 全局数组来存储每个小孩的苹果数,初始化为0
var apples []intfunc main() {var n, m, k int_, err := fmt.Scanln(&n, &m, &k)if err != nil {fmt.Println("Error reading input:", err)os.Exit(1)}// 初始化每个小孩的苹果数为0apples = 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 - napplesLeft--// 尝试分配剩余的苹果给小明及其相邻的小孩for applesLeft > 0 {if k > 0 && apples[k-1] <= apples[k]-1 {// 如果小明左边第一个小孩苹果数少于或等于小明苹果数减1,代表不具备小明苹果树+1的条件(条件是两者应该相等)则给小明左边的小孩一个苹果apples[k-1] = apples[k-1] + 1applesLeft--//每次剩余苹果数减一都需要判断是否为0if applesLeft == 0 {return apples[k]}i := k - 1//因为小明旁边第一个小孩苹果数+1啦,所以要判断他左边的小孩是否满足相差不超过1的原则,for i > 0 && apples[i-1] < apples[i]-1 {apples[i-1] = apples[i] + 1applesLeft--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] + 1applesLeft--if applesLeft == 0 {return apples[k]}i := k + 1for i < n-1 && apples[i+1] < apples[i]-1 {apples[i+1] = apples[i+1] + 1 //asdfapplesLeft--if applesLeft == 0 {return apples[k]}if apples[i+1] == apples[i]-1 {i++ //asdf}}} else {// 否则,给小明一个苹果apples[k] = apples[k] + 1applesLeft--}}// 返回小明分到的苹果数return apples[k]
}
疑惑解析
代码中明明是两个嵌套的for循环时间复杂度为什么是O(m)?
如果有这个疑惑,就代表对时间复杂度理解还是有些不足的,一般情况下时间复杂度是代码中根据数据的量的变化而相应变化,如代码中的每一次循环都会让苹果数-1,所以总的循环次数是与苹果数正相关的。