> 更多请前往 https://www.passerma.com/article/86
滑动窗口
1
给定一个矩阵,包含N*M个整数,和一个包含K个整数的数组。现在要求在这个矩阵中找一个宽度最小的子矩阵,要求子矩阵包含数组中所有的整数
function minSubmatrixWidth(matrix, nums) {
const row = matrix.length, col = matrix[0].length;
let minWidth = Infinity;
for (let i = 0; i < col; i++) {
const numsCopy = [...nums];
let found = 0;
for (let j = i; j < col; j++) {
for (let k = 0; k < row; k++) {
const num = matrix[k][j];
const index = numsCopy.indexOf(num);
if (index !== -1) {
numsCopy.splice(index, 1);
found++;
}
}
if (found === nums.length) {
minWidth = Math.min(minWidth, j - i + 1);
if (minWidth === 1) {
return minWidth
}
}
}
}
return minWidth
}
// 计算最小宽度的子矩阵
console.log(minSubmatrixWidth([
[1, 2, 3],
[3, 5, 6]
], [3, 6]));
console.log(minSubmatrixWidth([
[1, 2, 3],
[3, 5, 6]
], [1, 6]));
console.log(minSubmatrixWidth([
[1, 2, 3],
[3, 5, 6]
], [4]));
console.log(minSubmatrixWidth([
[1, 0, 1, 4],
[0, 0, 7, 8],
[1, 0, 11, 12],
[0, 0, 15, 16]
], [1, 0, 1, 0, 1, 0]));
输出:
循环
1
为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务,假设GPU最多一次执行n个任务,一次执行耗时1秒,在保证GPU不空闲情况下,最少需要多长时间执行完成
function minExecutionTime(maxExec, tasks) {
let remaining = 0, time = 0
for (let task of tasks) {
if (task + remaining > maxExec) {
remaining = task + remaining - maxExec;
} else {
remaining = 0;
}
time += 1;
}
while (remaining > 0) {
remaining -= maxExec;
time += 1;
}
return time
}
console.log(minExecutionTime(3, [1, 2, 3, 4, 5]));
console.log(minExecutionTime(4, [5, 4, 1, 1, 1]));
输出:
2
题目描述
现有两组服务器A和B,每组有多个算力不同的CPU,其中 A 是A组第个CPU的运算能力,是 B组 第个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。 为了让两组服务器的算力相等,允许从每组各选出一个CPU进行一次交换。 求两组服务器中,用于交换的CPU的算力,并且要求从A组服务器中选出的CPU,算力尽可能小。
输入描述
第一行输入为L1和L2,以空格分隔,L1表示A组服务器中的CPU数量,L2表示B组服务器中的CPU数量
第二行输入为A组服务器中各个CPU的算力值,以空格分隔.
第三行输入为B组服务器中各个CPU的算力值,以空格分隔 1 ≤ L1, L2 ≤ 10000 1 ≤ A[i], B[i] ≤ 100000
输出描述
对于每组测试数据,输出两个整数,以空格分隔,依次表示A组选出的CPU算力,B组选出的CPU算力。要求从A组选出的CPU的算力尽可能小。 备注:保证两组服务器的初始总算力不同,答案肯定存在。
示例1
输入:
2 2
1 1
2 2
输出
1 2
说明
从A组中选出算力为1的CPU,与B组中算力为2的进行交换,使两组服务器的算力都等于3
示例2
输入:
2 2
1 2
2 3
输出
1 2
示例3
输入:
1 2
2
1 3
输出
2 3
示例4
输入:
3 2
1 2 5
2 4
输出:
5 4
题解
function getMinCpu(a = [0], b = [0]) {
// 先计算总数,后面直接比较
const a_sum = a.reduce((prev, curr) => prev + curr, 0)
const b_sum = b.reduce((prev, curr) => prev + curr, 0)
// a 排序一下,后面匹配到了就是最小直接结束
a = a.sort((a, b) => a - b)
// 两次循环
for (let i = 0; i < a.length; i++) {
for (let j = 0; j < b.length; j++) {
const a_jh = a[i]
const b_jh = b[j]
// 计算交换之后的总和,相等即为最小的 a 的 cpu
const a_jh_sum = a_sum - a_jh + b_jh
const b_jh_sum = b_sum - b_jh + a_jh
if (a_jh_sum === b_jh_sum) {
return [a_jh, b_jh]
}
}
}
}
console.log(getMinCpu([1, 1], [2, 2]));
console.log(getMinCpu([1, 2], [2, 3]));
console.log(getMinCpu([2], [1, 3]));
console.log(getMinCpu([1, 2, 5], [2, 4]));
结果