3315. 构造最小位运算数组 II(贪心构造题)

https://leetcode.cn/problems/construct-the-minimum-bitwise-array-ii/description/

  1. 构造最小位运算数组 II

给你一个长度为 n 的质数
数组 nums。你的任务是返回一个长度为 n 的数组 ans ,对于每个下标 i ,以下 条件 均成立:
ans[i] OR (ans[i] + 1) == nums[i]
除此以外,你需要 最小化 结果数组里每一个 ans[i] 。
如果没法找到符合 条件 的 ans[i] ,那么 ans[i] = -1 。
质数 指的是一个大于 1 的自然数,且它只有 1 和自己两个因数。

示例 1:
输入:nums = [2,3,5,7]
输出:[-1,1,4,3]
解释:
对于 i = 0 ,不存在 ans[0] 满足 ans[0] OR (ans[0] + 1) = 2 ,所以 ans[0] = -1 。
对于 i = 1 ,满足 ans[1] OR (ans[1] + 1) = 3 的最小 ans[1] 为 1 ,因为 1 OR (1 + 1) = 3 。
对于 i = 2 ,满足 ans[2] OR (ans[2] + 1) = 5 的最小 ans[2] 为 4 ,因为 4 OR (4 + 1) = 5 。
对于 i = 3 ,满足 ans[3] OR (ans[3] + 1) = 7 的最小 ans[3] 为 3 ,因为 3 OR (3 + 1) = 7 。

示例 2:
输入:nums = [11,13,31]
输出:[9,12,15]
解释:
对于 i = 0 ,满足 ans[0] OR (ans[0] + 1) = 11 的最小 ans[0] 为 9 ,因为 9 OR (9 + 1) = 11 。
对于 i = 1 ,满足 ans[1] OR (ans[1] + 1) = 13 的最小 ans[1] 为 12 ,因为 12 OR (12 + 1) = 13 。
对于 i = 2 ,满足 ans[2] OR (ans[2] + 1) = 31 的最小 ans[2] 为 15 ,因为 15 OR (15 + 1) = 31 。

提示:
1 <= nums.length <= 100
2<=nums[i]<=109
nums[i] 是一个质数。

例如 x=100111,那么x(x+1)=100111101000=101111
可以发现,x(x+1)的本质是把二进制最右边的0置为1
反过来,如果我们知道了x(x+1)的结果101111,那么对应的x只能是这些:
100111。
101011。
101101。
101110。
其中最小的是100111,也就是把101111最右边的0的右边的1置为0
由于x(x+1)最低位一定是 1(因为xx+1其中一定有一个奇数),所以如果 nums[i]是偶数(质数中只有2),那么无解,答案为1

class Solution {
public:
    vector<int> minBitwiseArray(vector<int>& nums) {
       int n=nums.size();
       vector<int>ans;
       int a[100];
       for(int i=0;i<n;i++){
            if(nums[i]==2){
                ans.push_back(-1);
                continue;
            }
            int p=nums[i],cnt=0;
            while(p){
                a[++cnt]=p%2;
                p/=2;
            }
            int j=1;
            a[cnt+1]=0;
            for(j=1;j<=cnt;j++){
                if(a[j]==1&&a[j+1]==0){
                    break;
                }
            }
            a[j]=0,p=1;
            int z=0;
            for(int k=1;k<=cnt;k++){
                if(a[k]==1){
                    z=z+p;
                }
                p=p*2;
            }
            ans.push_back(z);
       }
       return ans;
    }
};

简易写法:

class Solution {
public:
    vector<int> minBitwiseArray(vector<int>& nums) {
        for (int& x : nums) { // 注意这里是引用
            if (x == 2) {
                x = -1;
            } else {
                int t = ~x;
                x ^= (t & -t) >> 1;
            }
        }
        return nums;
    }
};
posted @   lipu123  阅读(10)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示