如何解决CountDistinctSlices编码问题

时间:2020-11-07 14:17:06

标签: javascript algorithm

我正在尝试“ 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].

1 个答案:

答案 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);
}