当前位置: 首页 > news >正文

[M二分] lc1760. 袋子里最少数目的球(二分答案+数学推导+GoLang使用技巧)

文章目录

    • 1. 题目来源
    • 2. 题目解析

1. 题目来源

链接:1760. 袋子里最少数目的球

题单:

  • 待补充

2. 题目解析

思路

  • 看题意求最大、最小,很明显的二分答案,直接去二分满足条件下的最终袋子中球的个数。
  • 二段性思考
    • 如果最终袋子中球都是 1 个的话,那么袋子肯定很多,操作次数就非常多。
    • 如果最终袋子中球都可以装很多的时候,那么一开始都不用二分,操作次数就是 0。
    • 故,二分的边界点就是这个操作次数。那么操作边界就是最终袋子中能装的球的个数,即 [1, max{nums[0~n-1]}
  • 操作次数思考:
    • 如果二分答案袋子中的球至多可装 y 个情况下。
    • 那么原有袋子球在 [1,y] 的操作次数是 0,在 [y+1, 2y] 的操作次数是 1。
    • 数学归纳来看,nums[i] 的操作次数就是 n u m s [ i ] − 1 y {\frac{nums[i]-1}{y}} ynums[i]1

综上,本题实际上不是很难,值得一提的是:

  • 关于这个操作次数的推导,可以看看灵神那边针对边界、针对上取整、下取整的数学推导,更为严谨。可以看看官解中针对 1~y、y+1 ~2y 这种分段的判断,更为直观。
  • 最近拿 GoLang 写算法,比如二分,比如求 slice 中的最大元素,都有现成的库函数待学习。见这个博主的博文整理,挺不错的:【Go基础】Go算法常用函数整理

坑点:

  • C++ 选手记得开 long long 不然会爆…
  • [1000000000,1000000000,1000000000]
    1000000000
    这个数据,最终结果是 3,但 cnt 的累计就很多很多超过 int 上限了…

  • 时间复杂度 O ( n ) O(n) O(n)
  • 空间复杂度 O ( 1 ) O(1) O(1)

func minimumSize(nums []int, maxOperations int) int {
    check := func(k int) bool {
        cnt := 0
        for _, v := range nums {
            cnt += (v - 1) / k
        }
        return cnt > maxOperations
    }

    l, r := 1, slices.Max(nums)
    for l < r {
        mid := (l + r) / 2
        if check(mid) {
            l = mid + 1
        } else {
            r = mid
        }
    }

    return l
}

库函数写法:

func minimumSize(nums []int, maxOperations int) int {
	max := 0
	for _, x := range nums {
		if x > max {
			max = x
		}
	}
	return sort.Search(max, func(y int) bool {
		if y == 0 {
			return false
		}
		ops := 0
		for _, x := range nums {
			ops += (x - 1) / y
		}
		return ops <= maxOperations
	})
}

相关文章:

  • idea 2019.3常用插件
  • springboot接入ShardingJDBC
  • Mac zsh使用相关问题之一
  • (算法基础——树)——python树结构使用指南
  • EM235 模块
  • xxl-job分布式调度平台
  • Java并发编程6--重排序
  • 动态规划 之 背包问题
  • 融合模型预测控制 (MPC) 的 RL 算法
  • 【产品推介】可驱动5A负载的降压型DC/DC转换器XBL1663
  • Jenkins同一个项目不同分支指定不同JAVA环境
  • 穷举 vs 暴搜 vs 深搜 vs 回溯 vs 剪枝
  • 基于Flask的广西高校舆情分析系统的设计与实现
  • 《Nuxt.js 实战:从放弃到入门》六、打造个性化文字转图片工具
  • 各类系统Pycharm安装教程
  • MongoDB between ... and ... 操作
  • Android嵌套滑动造成的滑动冲突原理分析
  • 解惑Python:一文解决osgeo库安装失败问题
  • DeepSeek + Vue实战开发
  • Python字符模糊匹配指南 RapidFuzz | python小知识
  • 十堰网站建设培训学校/百度识图找原图
  • 网站文字格式/南京今天重大新闻事件
  • 建设网站 知乎/sem是什么缩写
  • 建设网站方案 ppt/自媒体推广渠道
  • 做网站为什么能挣钱/新疆头条今日头条新闻
  • 桂林seo/厦门seo全网营销