Kimi LeetCode 3806. 增加操作后最大按位与的结果 Golang实现
这是 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 的位
更多推荐

所有评论(0)