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

【LeetCode 每日一题】3314. 构造最小位运算数组 I —— (解法二) - 详解

Problem:3314. 构造最小位运算数组 I

文章目录

1. 整体思路与数学推导

核心观察

方程 x ∣ ( x + 1 ) = num x \mid (x + 1) = \text{num}x(x+1)=num的位运算行为如下:

逆向求解

给定 num,我们要还原最小的 x

  1. 奇偶性检查

    • 如果 num 是偶数,二进制末尾是 0。由于 x ∣ ( x + 1 ) x \mid (x+1)x(x+1) 必然把最低位的 0 填满成 1 甚至是更高的进位,结果一定是奇数。
  2. 寻找模式

    • num 的二进制形式必然是 ...011...1
    • 我们要找的 x 就是把这串连续 1最左边(最高位)的那个 1 变回 0
    • 例如:num = 10111 (23)。
      • 末尾连续的 1111
      • 我们要找的 x10011 (19)。
      • 验证:19 ∣ 20 = 10011 ∣ 10100 = 10111 = 23 19 | 20 = 10011 | 10100 = 10111 = 2319∣20=10011∣10100=10111=23。对!
  3. 位运算技巧

    • 取反~x:把末尾的连续 1 变成连续 0,紧邻的高位 0 变成 1
      • x = ...0111, ~x = ...1000.
    • Lowbitt & -t:提取二进制中最右侧的 1
      • 对于 ~x,最右侧的 1 恰好对应原数 x第一个非 1 的位置(即连续 1 左边的那个 0)
      • 但这还不是我们想要的。我们需要定位的是连续 1 中最高位的那个 1
    • 实际逻辑调整
      • 代码中的 lowbit 实际上找的是 x最低位的 0所对应的权值。
      • 例如 x = 10111 (23)。~x 末尾是 ...01000lowbit8 (1000)。
      • 这个 8 对应的是 x 中的那个 0
      • 我们要消除的 1 是这个 0右边一位1
      • 所以:lowbit >> 1 就是我们要消除的那个 1 的掩码。
      • x ^ (lowbit >> 1):通过异或操作,将该位翻转(从 1 变 0)。

2. 完整代码

import java.util.List;
class Solution {
public int[] minBitwiseArray(List<Integer> nums) {int n = nums.size();int[] ans = new int[n];for (int i = 0; i < n; i++) {int x = nums.get(i);// 特判:如果 x 是 2 (二进制 10),无法由 x|(x+1) 生成// 因为偶数(除了可能的位溢出情况)通常无法作为结果// 题目可能设定 x=2 时无解if (x == 2) {ans[i] = -1;} else {// 1. 取反:~x// 假设 x = ...0111 (二进制)// 则 ~x = ...1000int t = ~x;// 2. 求 lowbit:t & -t// 提取出 ~x 中最低位的 1。// 这个 1 对应的是原数 x 中从低位向高位看的"第一个 0"的位置。// 比如 x=...0111,这个 0 就是 111 左边的那个位。int lowbit = t & -t;// 3. 计算结果:x ^ (lowbit >> 1)// lowbit >> 1 得到的是 x 中"连续 1 序列"的最高位。// 用异或 (^) 将该位从 1 变成 0,即得到了满足条件的最小 x。// 例如 x = 10111 (23), 0 在第 4 位(值8), lowbit=8。// lowbit >> 1 = 4 (100)。// 23 ^ 4 = 10111 ^ 00100 = 10011 (19)。ans[i] = x ^ (lowbit >> 1);}}return ans;}}

3. 时空复杂度

假设 nums 的长度为 N NN

时间复杂度:O ( N ) O(N)O(N)

  • 计算依据
    • 代码只遍历了一次输入数组。
    • 循环内部全是位运算(取反、与、移位、异或),这些都是 CPU 的根本指令,耗时O ( 1 ) O(1)O(1)
    • 没有嵌套循环,没有递归。
  • 结论O ( N ) O(N)O(N)。这是处理此类问题的理论最优复杂度。

空间复杂度:O ( N ) O(N)O(N)

  • 计算依据
    • 使用了一个长度为N NN 的数组 ans 来存储结果。
  • 结论O ( N ) O(N)O(N)
http://www.jsqmd.com/news/390084/

相关文章:

  • 题解:洛谷 P1102 A-B 数对
  • Smoke and Mirrors inspiration
  • 这个时间序列预测模型有点意思,直接上代码更直观。咱们先看看整个模型的架构长啥样
  • 题解:洛谷 P1678 烦恼的高考志愿
  • 行业内服务好的盒马鲜生礼品卡回收平台推荐 - 京顺回收
  • 题解:洛谷 P1024 [NOIP 2001 提高组] 一元三次方程求解
  • 题解:洛谷 P2249 【深基13.例1】查找
  • 信任就是最好的协作:openclaw的系统提示词分析
  • AI大模型高薪方向揭秘:大模型时代,小白也能弯道超车?高薪收藏帖+90天转型路线图免费领!
  • 大模型国家标准落地,大模型应用指南:小白也能掌握的金融科技新趋势,收藏学习必备!
  • 阿里通义千问团队揭秘Gated Attention,让你的大模型学习效率飙升,速收藏!
  • 从DeepSeek到Seedance2.0,大模型集体爆发!国产AI突然跃迁,小白也能轻松上车收藏!
  • 2026大学生转行,推荐一个好就业的方向——人工智能大模型,开启高薪就业新赛道!
  • 【Hot100-Java便捷】:两数之和 (Two Sum) —— 从暴力枚举到哈希表的思维跃迁
  • 键盘与鼠标:人机交互的奥秘深度解析:原理、实战与踩坑记录
  • OpenClaw怎么做到不串台、能并行、还总回对群 amp;#129302;✅(含源码解析)--OpenClaw系列第1期
  • GLM5.0发布:国产算力突破,大模型进化为智能工作系统,速来收藏学习!
  • AI产品经理转行大模型必读,央视都说AI大模型人才缺口大,为什么大家还是找不到工作?
  • Transformer大模型从入门到进阶:25+核心知识点解析(收藏版)
  • 2026主流电商小程序平台深度测评:功能优势与适用场景全解析
  • 论文阅读“EFFICIENT VISION-LANGUAGE-ACTION MODELS FOR EMBODIED MANIPULATION: A SYSTEMATIC SURVEY“
  • 【GitHub项目推荐--pySLAM:开源、模块化、可扩展的视觉SLAM框架】⭐⭐⭐⭐⭐
  • 当一家公司拥有37,000个智能体:科技投资公司企业AI治理实验
  • 在线图片压缩工具怎么选?几款免费好用的网站对比
  • 【GitHub项目推荐--ORB-SLAM2:开源实时视觉SLAM系统】
  • SpringBoot集成SpringAI与Ollama本地大模型
  • 深入解析:【开题答辩全过程】以 基于微信小程序的医疗物资进销存管理为例,包含答辩的问题和答案
  • 【Python】【机器学习】线性回归
  • 【Python】【机器学习】十大算法简介与应用
  • GitHub 热榜项目 - 日榜(2026-02-17)