DeepSeek LeetCode 3806. 增加操作后最大按位与的结果 Java实现

📅 2026/8/5 8:25:53
DeepSeek    LeetCode 3806. 增加操作后最大按位与的结果 Java实现
你提供的这个函数签名正是 LeetCode 3806. 增加操作后最大按位与的结果 (Maximum Bitwise AND After Increment Operations) 。 问题描述· 操作你可以对数组 nums 进行最多 k 次操作每次将任意一个元素增加 1。· 目标操作完成后从数组中选择恰好 m 个元素最大化它们的按位与 (AND) 结果。· 示例nums [3,1,2], k 8, m 2将 3 和 2 分别增至 6 (共7次操作)得到 [6,6]按位与结果为 6这是最大值。 核心解法贪心 位运算核心思路是从高位到低位贪心构建答案1. 尝试置位对于每一位从高到低尝试将答案的该位设为 1得到一个 candidate。2. 计算最小成本计算将每个 nums[i] 通过 1 操作变成 y (需 y nums[i])使其满足 (y candidate) candidate 的最小操作次数 (y - nums[i])。· 这个计算的核心是找到 candidate 中为 1、但 x 中为 0 的最高位 j。然后把 x 低于 j 的位清零再将第 j 位设为 1。3. 可行性判断将所有元素的最小操作成本排序取最小的 m 个求和。4. 更新答案若总成本 k说明该位可置 1更新 ans candidate否则保留 0。 Java 实现javaimport java.util.Arrays;class Solution {public int maximumAND(int[] nums, int k, int m) {int ans 0;// nums[i] 1e9从第30位开始检查足够了[reference:21][reference:22]for (int bit 30; bit 0; bit--) {int candidate ans | (1 bit);long[] costs new long[nums.length];for (int i 0; i nums.length; i) {costs[i] minCost(nums[i], candidate);}Arrays.sort(costs);long totalCost 0;for (int i 0; i m; i) {totalCost costs[i];}if (totalCost k) {ans candidate;}}return ans;}// 计算将 x 变为 y (y x)使得 (y target) target 的最小代价private long minCost(int x, int target) {// 如果 x 已经满足条件代价为0[reference:23]if ((x target) target) {return 0;}// 1. 找到 target 中为1但 x 中为0的 最高位 j// 例如 target10110, x11010 - 从高到低第一个缺失位是 bit 2 (0-based)int missingBits target ~x;int j 31 - Integer.numberOfLeadingZeros(missingBits); // 获取最高位的索引[reference:24]// 2. 构造最小的 y x 以满足条件[reference:25]// 创建掩码将第 j 位及以下全部置1int mask (1 (j 1)) - 1;// y (x 的高位不变) | (将第 j 位置为1) | (将低位变为和 target 一样)long y (x ~mask) | (1 j) | (target (mask 1)); // mask 1 是低于 j 位的掩码return y - x;}}⚙️ 复杂度分析· 时间复杂度O(31 * n log n)。其中 n 是数组长度31是常数检查的位数。· 空间复杂度O(n)用于存储成本数组。