LC 2859.Sum of Values at Indices With K Set Bits

题目描述

这是 LeetCode 上的 2859. 计算 K 置位下标对应元素的和 - 力扣(LeetCode) ,难度为简单

给你一个下标从 0 开始的整数数组 nums 和一个整数 k

请你用整数形式返回 nums 中的特定元素之 ,这些特定元素满足:其对应下标的二进制表示中恰存在 k 个置位。

整数的二进制表示中的 1 就是这个整数的 置位

例如,21 的二进制表示为 10101 ,其中有 3 个置位。

示例 1:

1
2
3
4
5
6
7
8
9
10
输入:nums = [5,10,1,5,2], k = 1
输出:13
解释:下标的二进制表示是:
0 = 0002
1 = 0012
2 = 0102
3 = 0112
4 = 1002
下标 1、2 4 在其二进制表示中都存在 k = 1 个置位。
因此,答案为 nums[1] + nums[2] + nums[4] = 13

示例 2:

1
2
3
4
5
6
7
8
9
输入:nums = [4,3,2,1], k = 2
输出:1
解释:下标的二进制表示是:
0 = 002
1 = 012
2 = 102
3 = 112
只有下标 3 的二进制表示中存在 k = 2 个置位。
因此,答案为 nums[3] = 1

提示:

  • 1 <= nums.length <= 1000
  • 1 <= nums[i] <= 10^5
  • 0 <= k <= 10

解答

方法一:模拟

最简单的就是根据题目的要求进行模拟。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
int sum = 0;
for (int i = 0; i < nums.size(); ++i) {
int cnt = 0, cpm = 1;
while (cpm != 0) {
if ((cpm & i) != 0) {
++cnt;
}
cpm <<= 1;
}
if (cnt == k) {
sum += nums.get(i);
}
}
return sum;
}
}
  • 时间复杂度\(O(nm)\),其中 nnums 的长度,m 是每个下标的位数长度。

  • 空间复杂度\(O(1)\)

方法二:Population Count 算法

使用内置函数 Integer.bitCount() 算法进行加速运算。

Integer.bitCount() 内部实现感兴趣的可以参考下面的博客链接

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
int sum = 0;
for (int i = 0; i < nums.size(); ++i) {
if (Integer.bitCount(i) == k) {
sum += nums.get(i);
}
}
return sum;
}
}
  • 时间复杂度\(O(n \log \log C)\),其中 nnums 的长度, C 是数组 nums 的最大长度。内置函数 Integer.bitCount() 内部使用了分治算法,而 C\(O(\log C)\) 个二进制位,所以分治需要 \(O(\log \log C)\) 次。

  • 空间复杂度\(O(1)\)

每题一图


LC 2859.Sum of Values at Indices With K Set Bits
https://chen-huaneng.github.io/2024/01/25/2024-1-25-2024-01-25-lc-2859/
作者
Abel
发布于
2024年1月25日
更新于
2024年1月25日
许可协议