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
。
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 109
1 <= k <= 109
相似题目
原站题解
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