题目详情
给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。
然而,两个相同种类的任务之间必须有长度为 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。
你需要计算完成所有任务所需要的最短时间
示例:
输入: [‘A’ 5, ‘B’ 4, ‘C’ 4, ‘D’ 2, ‘E’ * 1], n = 5
输出: 25
思路
- 题意很简单,可是完全没思路。然后看答案吧,看了半天才看懂,果然只是凡人呐 QAQ
- 对tasks按照任务进行计数,记数目最多的任务为t,mx
- 问题转化为在tmax个任务之间的“槽”内尽可能安插别的任务,使idle最小化
- 本例中,数目最多的任务为t为 ‘A’ ,其间隔数n为5,我们先拟定一个这样的框架
- A o o o o o A o o o o o A o o o o o A o o o o o A
- 标记为 ‘o’ 的槽用任务数递减的来插入,也就变为
- A B o o o o A B o o o o A B o o o o A B o o o o A
- A B C o o o A B C o o o A B C o o o A B C o o o A
- A B C D o o A B C D o o A B C o o o A B C o o o A
- A B C D E o A B C D o o A B C o o o A B C o o o A
- 当n为2的时候
- A o o A o o A o o A o o A
- A B o A B o A B o A B o A
- A B C A B C A B C A B C A
- A B C A B C A B C A B D A C D E
具体代码
/**
* @param {character[]} tasks
* @param {number} n
* @return {number}
*/
var leastInterval = function(tasks, n) {
let arr = [], obj = {}
let mx = 0, mxCnt = 0
let len = tasks.length
for(let i = 0; i < len; i++) {
if(obj[tasks[i]]) obj[tasks[i]]++
else obj[tasks[i]] = 1
}
for(let key in obj) {
arr.push({type: key, num: obj[key]})
}
arr.sort(function(a, b) {
return b.num - a.num
})
let i = 0
mx = arr[0].num
while(i < arr.length && arr[i].num === mx) i++
return Math.max(len, (mx - 1) * (n + 1) + i)
};
Array - 48. 旋转图像
题目详情
给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
示例:
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
]
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
思路
- 先沿右下对角线进行交换,然后再以水平线进行交换
具体代码
/**
* @param {number[][]} matrix
* @return {void} Do not return anything, modify matrix in-place instead.
*/
var rotate = function(mat) {
let xLen = mat[0].length,
yLen = mat.length
for(let y = 0; y < xLen - 1; y++) {
for(let x = 0; x < xLen - 1 - y; x++) {
[mat[y][x], mat[xLen - 1 - x][yLen - 1 - y]] = [mat[xLen - 1 - x][yLen - 1 - y], mat[y][x]]
}
}
for(let y = 0; y < yLen / 2; y++) {
for(let x = 0; x < xLen; x++) {
[mat[y][x], mat[yLen - 1 - y][x]] = [mat[yLen - 1 - y][x], mat[y][x]]
}
}
};