当前位置: 首页 > 知识库问答 >
问题:

计算不同切片的数量(仅包含唯一的数字)

易星纬
2023-03-14

我解决了以下提供的协同问题。

给出了一个整数M和一个由N个非负整数组成的非空数组A。数组A中的所有整数都小于或等于M。

一对整数(P, Q),使得0≤P≤Q

例如,考虑整数M=6和数组A,这样:

A[0] = 3
A[1] = 4
A[2] = 5
A[3] = 5
A[4] = 2 There are exactly nine distinct slices: (0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2), (3, 3), (3, 4) and (4, 4).

目标是计算不同切片的数量。

编写函数:

类解决方案{公共int解决方案(int M,int[]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 the function should return 9, as explained above.

为以下假设编写一个有效的算法:

N是[1到100000]范围内的整数;M是[0..100000]范围内的整数;数组A的每个元素都是[0..M]范围内的整数。

我的解决方案在这里,

public static int solution(int M, int[] A) {

        boolean[] visited = new boolean[M + 1];

        int N = A.length;


        int result = 0;

        for (int i = 0; i < N; i++) {

            int k = i;
            int count = 0;

            while (i < N && !visited[A[i]]) {

                count++;
                visited[A[i]] = true;

                i++;
            }

            i -=1;

            // 3, 4, 5, 5, 2, 5, 4
            int j = i;

            while (j >= k && visited[A[j]]) {

                visited[A[j]] = false;
                j--;
            }

            result += count * (count + 1) / 2;
        }

        return result;
    }

然而,在线法官对正确性和性能的估计很低。如何改进?

共有2个答案

颛孙英才
2023-03-14

我喜欢MBo阐明的双指针方法和对访问的数组进行O(1)更新的想法。这里有一个单指针的想法,它使用一个哈希集来实现唯一性,每次新段开始时,该哈希集都会被清除。

js lang-js prettyprint-override">function f(A){
  var sum = 0
  var set = new Set
  var len = 0
  
  for (a of A){
    if (sum >= 1000000000)
      return 1000000000
      
    if (set.has(a)){
      sum += len*(len+1)/2
      len = 1
      set.clear()
      
    } else {
      len++
      set.add(a)
    }
  }
  sum += len*(len+1)/2
  
  return Math.min(sum, 1000000000)
}

var A = [3, 4, 5, 5 ,2]

console.log(f(A))
龙哲
2023-03-14

似乎你选择了正确的方法,但在实现细节上犯了错误——在坏主意中降低索引。

制作两个索引-左索引和右索引。

a) 向右移动,直到满足重复元素(“stopper”)的要求-基本上,您是在第一个while循环中执行此步骤。如果你在停车前走了n步,则有n*(n-1)/2个切片。

b)现在向左移动索引,直到找到与“停止器”相同的元素并在它之后停止。当前切片再次良好

重复a)和b)直到结束。请注意,两个索引都只向前移动,复杂性是线性的

 类似资料:
  • 问题内容: 如果我有三列: 我想计算一下表格中有多少唯一的电子邮件,我该怎么做? 如下语句: 给我总数。 我试过了 但这似乎并没有给我期望的数字。 问题答案: 采用 提供唯一的电子邮件ID,然后简单地对其进行计数。

  • 我试图解决这个问题。 给出了一个整数M和一个由N个非负整数组成的非空零索引数组A。数组A中的所有整数都小于或等于M。 一对整数(P,Q),使得0≤ P≤ Q 例如,考虑整数M=6和数组A,这样: 正好有九个不同的切片:(0, 0), (0, 1), (0, 2), (1, 1), (1,2), (2, 2), (3, 3), (3, 4)和(4,4)。 目标是计算不同切片的数量。 提前感谢。

  • 假设我有以下数据帧: 我想计算每个的不同值的数量。它应产生以下结果: 我该怎么做?

  • 问题内容: 我试图实现的目标很简单,但是很难解释,而且我不知道在postgres中它是否甚至有可能实现。我处于一个基本的水平。,等等基本的东西。 我试图计算包含特定字母/数字的行数,并根据字母/数字显示该计数。 即有多少行的条目包含“ a / A”(不区分大小写) 我要查询的表是电影名称的列表。我要做的只是对“ az”和“ 0-9”进行分组并计数,然后输出总计。我可以依次运行36个查询: 然后在结

  • 问题内容: 有没有类似于Go中的方法的东西,而不必搜索切片中的每个元素? 问题答案: Mostafa已经指出,编写这种方法很简单,而mkb为您提供了使用sort包中的二进制搜索的提示。但是,如果要进行很多此类包含检查,则还可以考虑使用地图。 使用惯用语检查特定的映射键是否存在很简单。由于您对值不感兴趣,因此也可以创建一个例如。在此处使用空值的优点是不需要任何额外的空间,并且Go的内部映射类型针对该

  • 是否有类似于方法,而不必搜索片中的每个元素?