我正在尝试“ CountDistinctSlices”编码问题。我尽了我最大的成绩30%,所以尝试去找一个做这件事的人以获取见识。基本上,我没有得到答案的是使用初始化的seen
数组(和M
的使用)以及如何使用它,有人得到它的好意会带我走这段代码
这是我在没有解释的情况下找到的答案
function solution(M, A) {
// write your code in JavaScript (Node.js 8.9.4)
let sum = 0;
let front = 0;
let back = 0;
const seen = new Array(M+1).fill(false);
while (front < A.length && back < A.length){
while (front < A.length && seen[A[front]] !== true){
sum += (front-back+1);
seen[A[front]] = true;
front += 1;
}
while (A[back] !== A[front]){
seen[A[back]] = false;
back += 1;
}
seen[A[back]] = false;
back += 1;
}
return Math.min(sum, 1000000000);
}
这是完整的问题
一个整数M和一个由N个非负数组成的非空数组A 给出整数。数组A中的所有整数均小于或等于 M。
将0≤P≤Q
例如,考虑整数M = 6和数组A,使得: A [0] = 3 A [1] = 4 A [2] = 5 A [3] = 5 A [4] = 2
一共有九个不同的切片:(0,0),(0,1),(0,2),(1, 1),(1、2),(2、2),(3、3),(3、4)和(4、4)。
目标是计算不同切片的数量。
编写函数:
function solution(M, A);
,给定一个整数M和一个由N组成的非空数组A 整数,返回不同切片的数量。
如果不同切片的数量大于1,000,000,000,则 函数应返回1,000,000,000。
例如,给定整数M = 6和数组A使得:
A[0] = 3 A[1] = 4 A[2] = 5 A[3] = 5 A[4] = 2
该函数应返回9,如上所述。
为以下假设写出有效的算法:
N is an integer within the range [1..100,000]; M is an integer within the range [0..100,000]; each element of array A is an integer within the range [0..M].
答案 0 :(得分:1)
让我们先了解一下算法:
您首先要从头开始并遍历,直到找到重复的副本。现在您有了一个range = [ beginning - current position ]
称为此范围的代码[back,front],其中“ back”是开头,“ front”是您的移动指针。
在此范围内有多少个不同的切片?有大小为1、2,...的切片。正面-背面+ 1,所以总和= {1 + 2 + 3 + ... [current_position - beginning + 1]
现在您遇到重复的操作了吗?您可以放心地忽略先前的[beginning - current_position]
范围,并以beginning = current_position
开始一个新范围,还可以重置set / boolean数组以查找重复项。
执行此操作,直到beginning
到达数组末尾为止。
您关于seen
的问题:
如何在数组中找到重复项?您可以使用Set或布尔数组。我认为M
的唯一目的是指定数组中元素可以具有的最大值。因此,代码使用大小为M
的布尔数组。
如果使用布尔数组,一旦找到值元素v
,您就可以说boolean_arr[v] = true
,表示它是“可见的”。
或者您可以使用一个集合并在需要时创建一个新集合,而不必每次发现重复项时都需要清除整个布尔数组-通过让JavaScript处理垃圾回收-如下所示(未完全测试):< / p>
function solution(M, A) {
// write your code in JavaScript (Node.js 8.9.4)
let sum = 0;
let front = 0;
let back = 0;
let set = new Set();
while (front < A.length){
while (front < A.length && !set.has(A[front])){
sum += (front-back+1);
set.add(A[front]);
front += 1;
}
back = front;
set = new Set();
}
return Math.min(sum, 1000000000);
}