2026-01-20-LeetCode刷题笔记-3314-构造最小位运算数组I


title: 2026-01-20-LeetCode刷题笔记-3314-构造最小位运算数组I

date: 2026-01-20

tags:

  • 算法学习
  • LeetCode
  • 位运算

题目信息


题目描述

给定一个整数数组 nums(题面为素数数组),对每个 numsi 寻找最小的非负整数 x,使得 x | (x + 1) == nums[i]。若不存在这样的 x,返回 -1。


初步思路

  1. 观察 x | (x + 1):它会把 x 的"最右侧第一个 0"变成 1,因此结果必然以连续的 1 结尾。
  2. 若 y = numsi,设 y 末尾连续 1 的个数为 k,则最小的 x 就是把这段连续 1 中最高位的那个 1 清掉。
  3. 题面为素数数组,因此只有 y=2 为偶数且无解,其他 y 都是奇数可处理。

算法分析

  • 核心:统计 y 的末尾连续 1 的个数 k,然后 x = y - (1 << (k - 1))
  • 技巧:x | (x + 1) 的结果一定是奇数且以连续 1 结尾
  • 时间复杂度:O(n * k),k 为末尾连续 1 的数量(总体很小)
  • 空间复杂度:O(1)(不含输出)

代码实现(Python)

解法一:统计末尾连续 1

python 复制代码
from typing import List

class Solution:
    def minBitwiseArray(self, nums: List[int]) -> List[int]:
        ans = []
        for num in nums:
            if num == 2:
                ans.append(-1)
                continue
            k = 0
            while num & (1 << k):
                k += 1
            ans.append(num - (1 << (k - 1)))
        return ans

解法二:位运算快速定位翻转位

python 复制代码
from typing import List

class Solution:
    def minBitwiseArray(self, nums: List[int]) -> List[int]:
        ans = []
        for num in nums:
            if num == 2:
                ans.append(-1)
                continue
            t = num ^ (num + 1)
            bit = (t + 1) >> 2
            ans.append(num ^ bit)
        return ans

总结与反思

  1. 关键在于"最右侧第一个 0 会被置 1",因此结果以连续 1 结尾。
  2. 可以用位运算快速定位要翻转的那一位
相关推荐
雪碧聊技术11 分钟前
力扣 LCR 091. 粉刷房子 —— 动态规划入门详解
算法·动态规划
遇乐的果园2 小时前
前端学习笔记-vue加载渲染优化
前端·笔记·学习
CV-Climber3 小时前
检索技术的实际应用
人工智能·算法
hhzz3 小时前
Tiger AI Platform平台中增加人脸识别功能
图像处理·人工智能·算法·计算机视觉·大模型
遇乐的果园4 小时前
前端学习笔记-vue状态管理优化
前端·笔记·学习
从零开始的代码生活_4 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
TsingtaoAI5 小时前
3D高斯泼溅技术发展及其在具身智能领域的应用综述
人工智能·算法·ai·具身智能·高斯泼溅
摇滚侠5 小时前
Java 全栈开发实战教程 课程笔记 29-33
笔记
atunet5 小时前
关于图算法中的连通分量检测与最小割问题7
算法