LeetCode 2917: Find the K-or of an Array (Bit Counting by Position)
LeetCode 2917Bit ManipulationCountingToday we solve LeetCode 2917 - Find the K-or of an Array.
Source: https://leetcode.com/problems/find-the-k-or-of-an-array/
English
Problem Summary
Given an integer array nums and an integer k, compute the K-or value. A bit is set in the answer if this bit is set in at least k numbers in nums.
Key Insight
Each bit position is independent. For every bit from 0 to 30, count how many numbers have that bit set. If the count is at least k, set this bit in the result.
Algorithm Steps
1) Initialize ans = 0.
2) For each bit position b in [0, 30], count numbers where bit b is 1.
3) If count ≥ k, do ans |= (1 << b).
4) Return ans.
Complexity Analysis
Let n be the length of nums.
Time: O(31 * n).
Space: O(1).
Reference Implementations (Java / Go / C++ / Python / JavaScript)
class Solution {
public int findKOr(int[] nums, int k) {
int ans = 0;
for (int b = 0; b <= 30; b++) {
int cnt = 0;
for (int x : nums) {
if (((x >> b) & 1) == 1) {
cnt++;
}
}
if (cnt >= k) {
ans |= (1 << b);
}
}
return ans;
}
}func findKOr(nums []int, k int) int {
ans := 0
for b := 0; b <= 30; b++ {
cnt := 0
for _, x := range nums {
if ((x >> b) & 1) == 1 {
cnt++
}
}
if cnt >= k {
ans |= 1 << b
}
}
return ans
}class Solution {
public:
int findKOr(vector<int>& nums, int k) {
int ans = 0;
for (int b = 0; b <= 30; ++b) {
int cnt = 0;
for (int x : nums) {
if ((x >> b) & 1) {
++cnt;
}
}
if (cnt >= k) {
ans |= (1 << b);
}
}
return ans;
}
};class Solution:
def findKOr(self, nums: list[int], k: int) -> int:
ans = 0
for b in range(31):
cnt = 0
for x in nums:
if (x >> b) & 1:
cnt += 1
if cnt >= k:
ans |= (1 << b)
return ans/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var findKOr = function(nums, k) {
let ans = 0;
for (let b = 0; b <= 30; b++) {
let cnt = 0;
for (const x of nums) {
if (((x >> b) & 1) === 1) {
cnt++;
}
}
if (cnt >= k) {
ans |= (1 << b);
}
}
return ans;
};中文
题目概述
给定整数数组 nums 和整数 k,求 K-or。若某个二进制位在数组中至少 k 个数里为 1,则答案该位为 1。
核心思路
每一位互不影响。对每个二进制位单独统计有多少数字在该位为 1,达到阈值 k 就把该位加入答案。
算法步骤
1)初始化 ans = 0。
2)枚举位 b(0 到 30),统计有多少 nums[i] 在该位为 1。
3)若统计值 ≥ k,则 ans |= (1 << b)。
4)返回 ans。
复杂度分析
设数组长度为 n。
时间复杂度:O(31 * n)。
空间复杂度:O(1)。
多语言参考实现(Java / Go / C++ / Python / JavaScript)
class Solution {
public int findKOr(int[] nums, int k) {
int ans = 0;
for (int b = 0; b <= 30; b++) {
int cnt = 0;
for (int x : nums) {
if (((x >> b) & 1) == 1) {
cnt++;
}
}
if (cnt >= k) {
ans |= (1 << b);
}
}
return ans;
}
}func findKOr(nums []int, k int) int {
ans := 0
for b := 0; b <= 30; b++ {
cnt := 0
for _, x := range nums {
if ((x >> b) & 1) == 1 {
cnt++
}
}
if cnt >= k {
ans |= 1 << b
}
}
return ans
}class Solution {
public:
int findKOr(vector<int>& nums, int k) {
int ans = 0;
for (int b = 0; b <= 30; ++b) {
int cnt = 0;
for (int x : nums) {
if ((x >> b) & 1) {
++cnt;
}
}
if (cnt >= k) {
ans |= (1 << b);
}
}
return ans;
}
};class Solution:
def findKOr(self, nums: list[int], k: int) -> int:
ans = 0
for b in range(31):
cnt = 0
for x in nums:
if (x >> b) & 1:
cnt += 1
if cnt >= k:
ans |= (1 << b)
return ans/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var findKOr = function(nums, k) {
let ans = 0;
for (let b = 0; b <= 30; b++) {
let cnt = 0;
for (const x of nums) {
if (((x >> b) & 1) === 1) {
cnt++;
}
}
if (cnt >= k) {
ans |= (1 << b);
}
}
return ans;
};
Comments