【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://www.pswp.cn/news/923708.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/923708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓开发工程师中高级知识点 —— 系统底层安全方向

一、AIDL 通信 Android Interface Definition Language 基于 Binder 实现跨进程通信&#xff08;IPC&#xff09;&#xff0c;核心是通过定义接口生成代理类&#xff0c;屏蔽底层 Binder 通信细节 适用于跨进程服务调用&#xff08;如系统服务、多App协作&#xff09;。常见于后…

动环监控系统-机房高效运维

动环监控系统&#xff08;全称为动力环境监控系统&#xff09;是机房高效运维的核心工具&#xff0c;通过集成动力、环境、安防、IT设备等模块&#xff0c;结合智能告警、AI分析、3D可视化等技术&#xff0c;实现机房的全方位监控与管理。动力系统监控供电设备&#xff1a;实时…

知微传感Dkam系列3D相机SDK例程篇:CSharp设置相机工作模式

设置3D相机触发模式 写在前面 本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有&#xff1a; 1、便利他人应用3D相机&#xff0c;本系列文章包含公司所出售相机的SDK的使用例程及详细注释&#xff1b;2、促进行业发展及交流。设置触发模式及API说明 触发模式说明 知…

PHP 常用函数及用法

文章目录PHP 常用函数及用法一、字符串处理函数1. 字符串基础操作2. 字符串查找与替换3. 字符串分割与连接4. 字符串大小写转换5. 字符串格式化二、数组操作函数1. 数组基础操作2. 数组遍历与查找3. 数组修改与排序4. 数组过滤与合并三、文件操作函数1. 文件读写2. 文件和目录信…

yum命令--obsoletes与--allowerasing两者的区别

在 YUM&#xff08;Yellowdog Updater Modified&#xff09;包管理工具中&#xff0c;–obsoletes 和 --allowerasing 是两个与包升级 / 安装相关的选项&#xff0c;它们的功能和使用场景有明显区别&#xff1a; 1. --obsoletes&#xff08;默认启用&#xff09;作用&#xff1…

Day24_【深度学习(3)—PyTorch使用(1)—张量的创建和类型转换】

一、创建张量1.张量基本创建方式torch.tensor 根据指定数据创建张量 &#xff08;最重要&#xff09;torch.Tensor 根据形状创建张量, 其也可用来创建指定数据的张量torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 创建指定类型的张量1.1 torch.tensor# 方式一&…

阿里云图像编辑大模型开发部署

与阿里云一起轻松实现数智化让算力成为公共服务&#xff1a;用大规模的通用计算&#xff0c;帮助客户做从前不能做的事情&#xff0c;做从前做不到的规模。让数据成为生产资料&#xff1a;用数据的实时在线&#xff0c;帮助客户以数据为中心改变生产生活方式创造新的价值。图像…

查看磁盘分区并新建一个分区,挂载分区

linux系统磁盘df -h查看文件系统的磁盘的空间占用情况&#xff0c;常用于快速检查磁盘使用率&#xff1a;df -h-h是说把磁盘空间以G位单位&#xff0c;如果直接用df也是可以的&#xff0c;只不过单位是块&#xff0c;看的不明显du -sh /home/查看/home目录下总共占用了多大的空…

vscode单击暂时预览文件 双击持续打开文件

直接单击文件列表中的文件&#xff0c;会在编辑器中以预览模式打开 文件标签会显示为斜体&#xff0c;表示是预览状态 当您单击另一个文件或开始编辑时&#xff0c;预览文件会自动关闭 在 settings.json 中添加&#xff0c;mac通过cmd,实现。 json {"workbench.editor.ena…

设计模式-桥接模式04

什么是桥接模式&#xff1f; 桥接模式就是把事物的两个方面&#xff08;两个变化的维度&#xff09;分开管理&#xff0c;让它们可以分别自由变化&#xff0c;然后通过一个“桥”把它们连接起来。举个生活中的例子 想象一下你在买鞋子&#xff1a; 鞋子有不同的款式&#xff08…

群晖企业级NAS :从中小企业效率工具到核心业务数据基石

在数字化转型加速的今天&#xff0c;数据已成为企业最核心的资产。全球超半数财富 500 强企业选择群晖&#xff08;Synology&#xff09;作为数据管理伙伴&#xff0c;其企业级 NAS 解决方案凭借 DSM 操作系统的生态优势、硬件与软件的深度协同&#xff0c;以及覆盖全场景的产品…

C++访问限定符private、public、protected的使用场景

C 访问控制关键字&#xff1a;public、private、protected 在C中&#xff0c;public、private和protected是访问控制关键字&#xff0c;用于实现面向对象编程的封装特性&#xff0c;控制类成员的访问权限。 访问控制关键字的使用场景 1. public&#xff08;公有成员&#xff09…

CKA08--PVC

Task mariadb namespace 中的 MariaDB Deployment 被误删除。请恢复该 Deployment 并确保数据持久性。 请按照以下步骤&#xff1a; 如下规格在 mariadb namespace 中创建名为 mariadb 的 PersistentVolumeClaim (PVC)&#xff1a; 访问模式为 ReadWriteOnce 存储为 250Mi 集群…

Freertos系列(调度机制与创建任务)

如果不想看的可以直接使用git把我的代码下载出来&#xff0c;里面工程挺全的&#xff0c;后期会慢慢的补注释之类的 码云地址&#xff1a;stm32学习笔记: stm32学习笔记源码 如果不会使用git快速下载可以选择直接下载压缩包或者去看看git的使用 Git入门教程-CSDN博客 一 调…

C++中std::vector Vs std::deque VS std::list对比详解

1) 核心差异速览 std::vector&#xff1a;连续内存、随机访问 O(1)、尾部 push_back 摊还 O(1)、中间插入/删除 O(n)&#xff0c;非常缓存友好。std::deque&#xff1a;分段&#xff08;block&#xff09;存储&#xff0c;不是整体连续&#xff1b;随机访问 O(1)&#xff08;但…

【js】js实现日期转大写:

文章目录一、方法&#xff1a;二、使用效果&#xff1a;一、方法&#xff1a; export function dateToChnese(strDate) {let dateMap {year: "",month: "",day: ""}if (!strDate || strDate.length 0) return dateMap;const chineseDigit [&…

逆向 js

参考地址&#xff1a;https://blog.csdn.net/2302_80243887/article/details/146349209 注意事项 1. crypto-js 安装 需要你的.js文件同级目录执行npm install crypto-js 才能让js文件引入包 注意事项2&#xff1a; crypto-js 执行js 报错_external_runtime.py" A…

FFmpeg的安装及简单使用

简介 FFmpeg 是一个跨平台的音视频处理工具库/命令行工具&#xff0c;其核心作用是&#xff1a;对音视频文件或流进行解码、转换&#xff08;编码&#xff09;、封装/解封装等处理。 友情提示 本次安装以Windows64位操作系统为例 一、下载及安装 1、前往FFmpeg官网&#xff0…

Science Advances--3D打印生物启发扭曲双曲超材料,用于无人机冲击缓冲和自供电实时传感

湍流引起的振动会对飞机的结构完整性及飞行稳定性造成巨大威胁&#xff0c;尤其是在无人驾驶飞行器&#xff08;UAV&#xff09;中&#xff0c;实时的冲击监测和轻质防护尤为重要。该研究基于生物启发&#xff0c;通过3D 打印尼龙PA12 制备了一种扭转-双曲面超材料&#xff08;…

AI大模型的研发流程

开发一个大模型是一个庞大、复杂且资源密集的系统工程&#xff0c;涉及算法研究、工程实现、数据管理和算力基础设施等多个层面。下面我将为您提供一个从零开始开发大模型的全景式路线图&#xff0c;涵盖了从概念到部署的全过程。请注意&#xff0c;完全从零开始训练一个类似GP…