这是 LeetCode 3806 Maximum Bitwise AND After Increment Operations 的 Go 实现。

核心思路

贪心逐位构造答案。从高到低枚举每一位,尝试将其加入结果。对于候选值 `target`,计算每个 `nums[i]` 提升到包含 `target` 所有 1 位的最小代价,取最小的 `m` 个代价之和,若不超过 `k` 则该位可行。

Go 实现

```go
package main

import (
    "sort"
)

func maximumAND(nums []int, k int, m int) int {
    // 找到数组最大值 + k,确定需要检查的最高位数
    maxVal := nums[0]
    for _, x := range nums {
        if x > maxVal {
            maxVal = x
        }
    }
    maxVal += k

    // 计算 maxVal 的二进制位数
    mx := 0
    for v := maxVal; v > 0; v >>= 1 {
        mx++
    }

    ans := 0
    cost := make([]int, len(nums))

    for bit := mx - 1; bit >= 0; bit-- {
        target := ans | (1 << bit)
        for i, x := range nums {
            diff := target & ^x // target 中为1但x中为0的位
            // 计算 diff 的二进制位数
            j := 0
            for v := diff; v > 0; v >>= 1 {
                j++
            }
            // 低 j 位的掩码
            mask := (1 << j) - 1
            cost[i] = (target & mask) - (x & mask)
        }
        sort.Ints(cost)
        sum := 0
        for i := 0; i < m; i++ {
            sum += cost[i]
        }
        if sum <= k {
            ans = target
        }
    }

    return ans
}
```

优化版本(使用 `math/bits`)

```go
package main

import (
    "math/bits"
    "sort"
)

func maximumAND(nums []int, k int, m int) int {
    // 找到数组最大值
    maxVal := nums[0]
    for _, x := range nums {
        if x > maxVal {
            maxVal = x
        }
    }
    maxVal += k

    // bits.Len 返回 uint 的二进制位数(最高位的位置+1)
    mx := bits.Len(uint(maxVal))

    ans := 0
    cost := make([]int, len(nums))

    for bit := mx - 1; bit >= 0; bit-- {
        target := ans | (1 << bit)
        for i, x := range nums {
            // bits.Len(0) = 0,bits.Len(>0) 返回最高位的位置+1
            j := bits.Len(uint(target & ^x))
            mask := (1 << j) - 1
            cost[i] = (target & mask) - (x & mask)
        }
        sort.Ints(cost)
        sum := 0
        for i := 0; i < m; i++ {
            sum += cost[i]
        }
        if sum <= k {
            ans = target
        }
    }

    return ans
}
```

复杂度

- 时间:O(n \log n \cdot \log M),其中 M = \max(nums) + k
- 空间:O(n)

关键说明

- `bits.Len(uint(v))`:返回 `v` 的二进制位数。当 `v == 0` 时返回 `0`,否则返回最高位的位置+1(例如 `bits.Len(uint(6))` = `3`,因为 `6 = 110`)
- `mask = (1 << j) - 1`:低 `j` 位全为 1 的掩码。当 `j = 0` 时,`mask = 0`,代价为 `0`
- `diff = target & ^x`:`target` 中为 1 但 `x` 中为 0 的位

 

更多推荐