列表

详情


3171. 找到按位与最接近 K 的子数组

给你一个数组 nums 和一个整数 k 。你需要找到 nums 的一个 子数组 ,满足子数组中所有元素按位与运算 AND 的值与 k 的 绝对差 尽可能  。换言之,你需要选择一个子数组 nums[l..r] 满足 |k - (nums[l] AND nums[l + 1] ... AND nums[r])| 最小。

请你返回 最小 的绝对差值。

子数组是数组中连续的 非空 元素序列。

 

示例 1:

输入:nums = [1,2,4,5], k = 3

输出:1

解释:

子数组 nums[2..3] 的按位 AND 运算值为 4 ,得到最小差值 |3 - 4| = 1 。

示例 2:

输入:nums = [1,2,1,2], k = 2

输出:0

解释:

子数组 nums[1..1] 的按位 AND 运算值为 2 ,得到最小差值 |2 - 2| = 0 。

示例 3:

输入:nums = [1], k = 10

输出:9

解释:

只有一个子数组,按位 AND 运算值为 1 ,得到最小差值 |10 - 1| = 9 。

 

提示:

相似题目

划分数组得到最小的值之和

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int minimumDifference(vector<int>& nums, int k) { } };

golang 解法, 执行用时: 92 ms, 内存消耗: 8.5 MB, 提交时间: 2024-06-04 10:16:11

func minimumDifference(nums []int, k int) int {
	ans := math.MaxInt
	for i, x := range nums {
		ans = min(ans, abs(x-k))
		for j := i - 1; j >= 0 && nums[j]&x != nums[j]; j-- {
			nums[j] &= x
			ans = min(ans, abs(nums[j]-k))
		}
	}
	return ans
}

func abs(x int) int { if x < 0 { return -x }; return x }

cpp 解法, 执行用时: 126 ms, 内存消耗: 92.7 MB, 提交时间: 2024-06-04 10:15:40

class Solution {
public:
    int minimumDifference(vector<int>& nums, int k) {
        int ans = INT_MAX;
        for (int i = 0; i < nums.size(); i++) {
            int x = nums[i];
            ans = min(ans, abs(x - k));
            for (int j = i - 1; j >= 0 && (nums[j] & x) != nums[j]; j--) {
                nums[j] &= x;
                ans = min(ans, abs(nums[j] - k));
            }
        }
        return ans;
    }
};

java 解法, 执行用时: 11 ms, 内存消耗: 55.1 MB, 提交时间: 2024-06-04 10:15:24

class Solution {
    public int minimumDifference(int[] nums, int k) {
        int ans = Integer.MAX_VALUE;
        for (int i = 0; i < nums.length; i++) {
            int x = nums[i];
            ans = Math.min(ans, Math.abs(x - k));
            for (int j = i - 1; j >= 0 && (nums[j] & x) != nums[j]; j--) {
                nums[j] &= x;
                ans = Math.min(ans, Math.abs(nums[j] - k));
            }
        }
        return ans;
    }
}

python3 解法, 执行用时: 612 ms, 内存消耗: 30.9 MB, 提交时间: 2024-06-04 10:14:56

# 位运算,利用and的性质
class Solution:
    def minimumDifference(self, nums: List[int], k: int) -> int:
        ans = inf
        for i, x in enumerate(nums):
            ans = min(ans, abs(x - k))
            j = i - 1
            while j >= 0 and nums[j] & x != nums[j]:
                nums[j] &= x
                ans = min(ans, abs(nums[j] - k))
                j -= 1
        return ans

上一题