js算法记录

> 更多请前往 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]));

结果
在这里插入图片描述

> 更多请前往 https://www.passerma.com/article/86

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dijkstra算法是一种单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。在Dijkstra算法中,我们可以通过记录每个节点的前驱节点来记录路径。具体实现如下: 1. 初始化一个distance数组,用来记录源节点到每个节点的距离,对于源节点,距离为0,对于其他节点,距离为无穷大。 2. 初始化一个visited数组,用来记录每个节点的访问状态,对于源节点,访问状态为true,对于其他节点,访问状态为false。 3. 初始化一个predecessor数组,用来记录每个节点的前驱节点,对于源节点,前驱节点为null,对于其他节点,前驱节点为undefined。 4. 将源节点加入一个优先队列中。 5. 从优先队列中取出一个节点,标记其为已访问,遍历其所有邻居节点,如果该邻居节点未被访问,则计算源节点到该邻居节点的距离,如果该距离小于distance数组中该节点的距离,则更新distance数组和predecessor数组,并将该邻居节点加入优先队列中。 6. 重复步骤5,直到所有节点都被访问过。 7. 根据predecessor数组可以得到源节点到每个节点的最短路径。 下面是一个JavaScript实现示例: ``` function dijkstra(graph, source) { var distance = []; var visited = []; var predecessor = []; var queue = new PriorityQueue(); for (var i = 0; i < graph.length; i++) { distance[i] = Infinity; visited[i] = false; predecessor[i] = undefined; } distance[source] = 0; queue.enqueue(source, 0); while (!queue.isEmpty()) { var u = queue.dequeue(); if (visited[u]) { continue; } visited[u] = true; for (var v = 0; v < graph[u].length; v++) { if (graph[u][v] !== 0 && !visited[v]) { var alt = distance[u] + graph[u][v]; if (alt < distance[v]) { distance[v] = alt; predecessor[v] = u; queue.enqueue(v, distance[v]); } } } } return predecessor; } ``` 注:上述实现中,我们使用了一个优先队列来存储节点和节点距离,这样可以保证每次取出的是距离最小的节点,从而保证算法的正确性。你可以使用任何优先队列实现,例如JavaScript中的数组,Java中的PriorityQueue等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值