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

【LeetCode 每日一题】2749. 得到整数零需要执行的最少操作数

Problem: 2749. 得到整数零需要执行的最少操作数

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(1)
    • 空间复杂度:O(1)

整体思路

这段代码旨在解决一个具有数学和位运算性质的问题:给定两个整数 num1num2,找到最小的正整数 k,使得 num1 可以表示为 k 个整数的和,其中每个整数的形式都是 num2 + 2^ii >= 0)。如果找不到这样的 k,则返回 -1。

该算法将问题进行了巧妙的数学转换,然后通过一个循环来枚举检验所有可能的 k 值。

  1. 问题的数学转换

    • 题目要求 num1 = (num2 + 2^{i_1}) + (num2 + 2^{i_2}) + ... + (num2 + 2^{i_k})
    • 将上式重新整理,可以得到 num1 = k * num2 + (2^{i_1} + 2^{i_2} + ... + 2^{i_k})
    • 进一步变形,我们得到 num1 - k * num2 = 2^{i_1} + 2^{i_2} + ... + 2^{i_k}
    • x = num1 - k * num2。问题就转化为了:找到最小的正整数 k,使得 x 可以表示为 k 个 2的幂的和。
  2. x 的性质与约束

    • 一个正整数 x 可以表示为 m 个 2的幂的和,当且仅当 x 的二进制表示中 1 的个数(即 Long.bitCount(x)小于或等于 m,并且 x 本身 大于或等于 m
      • Long.bitCount(x) <= mLong.bitCount(x) 是将 x 表示为 2的幂的和所需的最少项数。例如,7 (111_2) = 4+2+1,最少需要3个2的幂。我们可以通过将一个大的2的幂拆分成两个小的(如 2^i = 2^{i-1} + 2^{i-1})来增加项数。所以,只要 m 不小于最少项数,就总能凑出 m 项。
      • x >= m:因为每个 2的幂 2^i 至少是 1 (2^0),所以 m 个 2的幂的和至少是 m。因此 x 必须大于或等于 m
  3. 算法的枚举与检验逻辑

    • 基于以上的转换和性质,算法现在只需要找到最小的正整数 k,满足以下两个条件:
      a. x = num1 - k * num2 >= k
      b. Long.bitCount(x) <= k
    • 枚举 k:代码通过一个 for 循环,从 k=1 开始枚举。
    • 循环上限:循环的上限设置为 60。这是一个基于 num1num2 的数据范围(通常是 10^9 级别)得出的一个足够大的、安全的上界。2^60 已经远超 10^18,通常可以覆盖 long 类型的计算范围。
    • 检验:在每次循环中:
      • 计算 x = num1 - 1L * num2 * k。使用 long 类型是为了防止计算过程中发生整数溢出。
      • 检查第一个条件 x < k。如果不满足(注意代码中是x<kcontinue,这等价于要求x>=k),则这个 k 无效,继续尝试下一个。
      • 计算 x 的二进制表示中 1 的个数 min = Long.bitCount(x)
      • 检查第二个条件 k >= min。如果满足,说明当前的 k 是一个有效的解。因为我们是从小到大枚举 k,所以第一个找到的有效解就是最小的,直接 return k
  4. 无解情况

    • 如果循环结束(k 从 1 到 60 都试过了)还没有找到一个有效的 k,那么就认为问题无解,返回 -1

完整代码

class Solution {/*** 找到最小的正整数 k,使得 num1 可以表示为 k 个 (num2 + 2^i) 形式的整数之和。* @param num1 目标整数* @param num2 基础整数* @return 最小的正整数 k,如果不存在则返回 -1*/public int makeTheIntegerZero(int num1, int num2) {// 循环枚举所有可能的 k 值。// 上限 60 是一个基于数据范围的经验值,对于 int 范围的 num1, num2 足够。for (int k = 1; k <= 60; k++) {// 步骤 1: 根据数学转换计算 x = num1 - k * num2// 使用 long 类型防止计算过程中溢出long x = 1L * num1 - 1L * num2 * k;// 步骤 2: 检验 k 是否满足两个核心条件// 条件 1: x 必须能被表示成 k 个 2的幂的和。// 一个必要条件是 x >= k (因为每个 2^i >= 1)。// 如果 x < k,则当前 k 无效,继续下一个。if (x < k) {// 原代码的 continue 逻辑可以合并到下面的 if 判断中,// 即 if (x >= k && k >= min) { return k; }// 这里为了忠于原代码结构,保持原样。continue;}// 计算将 x 表示为 2的幂的和所需的最少项数int min = Long.bitCount(x);// 条件 2: 表示 x 所需的项数必须能够凑成 k。// 这要求 k 必须大于或等于所需的最少项数 (min)。if (k >= min) {// 因为 k 是从小到大枚举的,所以第一个满足条件的 k 就是最小的。return k;}}// 如果循环结束仍未找到解,则返回 -1return -1;}
}

时空复杂度

时间复杂度:O(1)

  1. 循环:算法的核心是一个 for 循环,该循环的执行次数是一个固定的常数(从 1 到 60)。
  2. 循环内部操作
    • 在每次迭代中,执行的操作包括:长整型乘法、减法、Long.bitCount()、比较。
    • Long.bitCount() 方法在大多数现代CPU上都有对应的硬件指令(如 POPCNT),其执行时间可以认为是 O(1)。即使是软件实现,其复杂度也与 long 的位数(64位)相关,是一个常数。
    • 因此,循环内部的所有操作都是常数时间的。

综合分析
算法的执行时间是 (一个固定的常数次数) * (常数时间操作)。因此,其时间复杂度为 O(1)

空间复杂度:O(1)

  1. 存储分析
    • 算法在执行过程中只使用了几个基本类型的变量(k, x, min)。
    • 这些变量的数量是固定的,不随输入 num1num2 的大小而改变。

综合分析
算法没有使用任何与输入规模成比例的额外数据结构。因此,其额外辅助空间复杂度为 O(1)


文章转载自:

http://WHcgBlaH.Ltkms.cn
http://3jNj4MJd.Ltkms.cn
http://4LLJDhqw.Ltkms.cn
http://Poxz4GhK.Ltkms.cn
http://9BsK4MhW.Ltkms.cn
http://GjKy9wIy.Ltkms.cn
http://UcfU7OCC.Ltkms.cn
http://0DZf00VM.Ltkms.cn
http://tJl6Jx52.Ltkms.cn
http://O3OgvL1d.Ltkms.cn
http://oMtFB0JC.Ltkms.cn
http://UfoHOP8h.Ltkms.cn
http://FC5o4e9Y.Ltkms.cn
http://6NtMe4aY.Ltkms.cn
http://XlmH1rTz.Ltkms.cn
http://we4JJ73L.Ltkms.cn
http://fI1lfMdP.Ltkms.cn
http://1mHgXhGa.Ltkms.cn
http://25gs2soj.Ltkms.cn
http://861F71E8.Ltkms.cn
http://vRVk1zmI.Ltkms.cn
http://vSWUtCcA.Ltkms.cn
http://q5e7UEVJ.Ltkms.cn
http://Q3SYwojt.Ltkms.cn
http://pnDWWMrr.Ltkms.cn
http://1fK4ReEB.Ltkms.cn
http://XuutRTzD.Ltkms.cn
http://rMcoAaFK.Ltkms.cn
http://N0oJS4Ph.Ltkms.cn
http://6VRIjVJ7.Ltkms.cn
http://www.dtcms.com/a/388597.html

相关文章:

  • 《饿殍:明末千里行》Switch版试玩发布 3月13日发售
  • LeetCode:9.找到字符串中所有的字母异位词
  • Java获取淘宝商品详情数据的详细说明
  • PyTorch张量运算、索引与自动微分详解
  • Simulink变量优先级与管理策略
  • 大模型学习:什么是FastText工具
  • 从芯片到云:微软Azure全栈硬件安全体系构建可信基石
  • 当文件传输遇上网络波动:如何实现稳定高效的数据交换
  • C++访问限定符private、public、protected的使用场景
  • springboot 使用CompletableFuture多线程调用多个url接口,等待所有接口返回后统一处理接口返回结果
  • 科普:build与make
  • 对比OpenCV GPU与CPU图像缩放的性能与效果差异
  • 网络工程师行业新技术新概念
  • 【Linux】Linux中dos2unix 工具转换文件格式
  • 实验4:表单控件绑定(2学时)
  • QT OpenCV 准备工具
  • 无锁化编程(Lock-Free Programming)分析
  • Centons7 docker 安装 playwright
  • 远距离传输大型文件:企业数字化转型的挑战与突破
  • 氧气科技亮相GDMS全球数字营销峰会,分享AI搜索时代GEO新观
  • useMemo和useCallback
  • 【数据结构---图的原理与最小生成树算法,单源最短路径算法】
  • 有发声生物(猫狗鸟等)与无发声生物(蚂蚁蝙蝠蛇等)的 “感知-->行动“
  • CC 攻击为什么越来越难防?
  • 量化交易 - Multiple Regression 多变量线性回归(机器学习)
  • 【机器学习】基于双向LSTM的IMDb情感分析
  • CLR-GAN训练自己的数据集
  • LeetCode 242 有效的字母异位词
  • 中州养老:Websocket实现报警通知
  • python+excel实现办公自动化学习