javascript - 长度为 n 且 k 连续为 1 的二进制数组的数量
问题描述
Input: N = 4, K = 3
Output: 3 // "111", "1110", "1111"
我用这段代码解决了这个问题:
function getQuantity(n, k) {
const nums = [];
const re = new RegExp(`^.*[1]{${k}}.*?$`, "m");
// Convert to decimal
var maxDecimal = Math.pow(2, n) - 1;
// For every number between 0->decimal
for (let i = 0; i <= maxDecimal; i++) {
if (re.test(i.toString(2))) {
nums.push(i.toString(2));
}
}
return nums.length;
}
但我想这是开销解决方案。也许有更好的方法来解决这个问题?
解决方案
您的方法的复杂度为 O(2^N)。使用递归或迭代方法会产生 O(N) 复杂度。
关系是这样的:f(n+1, k) = 2*f(n, k) + 2^{n-k} - f (n-k, k)
f(n, k) = 0
如果 (n < k)和f(k, k) = 1
最后一项2^{n-k} - f (n-1-k)
对应于新解的附加数量,当 a1
被添加到第 (n+1) 个位置时,一个0
和 (k-1)1
就在前面。然后还有一些n-k
需要设置的位,即潜在2^{n-k}
的新解决方案。但是,该术语- f(n-k, k)
不需要计算已包含在该f(n, k)
术语中的解决方案。
推荐阅读
- java - Java中是否有相当于Android的LRUCache?
- javascript - aql.literal 不是 arangoDB Foxx 中的函数
- node.js - Sequelize JS,仅当存在多对多相关实体时才找到一个
- r - geom_dotplot 圆点填充的小数点位
- java - 如何查看 com.fasterxml.jackson 日志消息
- javascript - Chart.js -> 折线图 -> 具有相同 X 的多个点
- chisel - 如何从凿子中破译生成的 Verilog 中的注释?
- r - R - visNetwork - 向边缘添加动画
- meteor - 使用流星流-db-admin 的 simpl-schema 无法与 autoform 一起使用
- python-3.x - Pyspark:如何在通过配置单元上下文执行时在 sql 脚本中传递参数