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

计数数组中的不同切片

金晗日
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 

正好有九个不同的切片:(0, 0), (0, 1), (0, 2), (1, 1), (1,2), (2, 2), (3, 3), (3, 4)和(4,4)。

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

提前感谢。

#include <algorithm>
#include <cstring>
#include <cmath>
#define MAX 100002

// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;

using namespace std;

bool check[MAX];

int solution(int M, vector<int> &A) {
    memset(check, false, sizeof(check));
    int base = 0;
    int fibot = 0;
    int sum = 0;

    while(fibot < A.size()){

        if(check[A[fibot]]){
            base = fibot;
        }

        check[A[fibot]] = true;

   sum += fibot - base + 1;
        fibot += 1;  
    }

    return min(sum, 1000000000);
}

共有3个答案

池麒
2023-03-14

我想分享我用C语言实现的算法的解释,然后是实际实现。

  1. 请注意,由于每个元素都是一个不同的一项切片,因此不同切片的最小数量为N

这个解决方案的运行时复杂性是O(N),因为我们要遍历每个元素。

这个解决方案的空间复杂度是O(M),因为我们有一个散列来存储序列中出现的元素。此哈希的最大元素是M。

int solution(int M, vector<int> &A)                                             
{                                                                               
  int N = A.size();                                                             
  int distinct_slices = N;                                                      
  vector<bool> seq_hash(M + 1, false);                                          
  for (int back = 0, front = 0; front < N; ++back) {                            
    while (front < N and !seq_hash[A[front]]) { distinct_slices += front - back; if (distinct_slices > 1000000000) return 1000000000; seq_hash[A[front++]] = true; }
    while (front < N and back < N and A[back] != A[front]) seq_hash[A[back++]] = false;
    seq_hash[A[back]] = false;                                                  
  }                                                                             
                                                                                
  return distinct_slices;                                                       
}
朱淮晨
2023-03-14

100%python解决方案帮助了我,这要感谢https://www.martinkysel.com/codility-countdistinctslices-solution/

def solution(M, A):
    
        the_sum = 0
    
        front = back = 0
    
        seen = [False] * (M+1)
    
        while (front < len(A) and back < len(A)):
    
            while (front < len(A) and seen[A[front]] != True):
    
                the_sum += (front-back+1)
    
                seen[A[front]] = True
    
                front += 1
    
            else:
    
                while front < len(A) and back < len(A) and A[back] != A[front]:
    
                    seen[A[back]] = False
    
                    back += 1
    
                seen[A[back]] = False
    
                back += 1
                   
        return min(the_sum, 1000000000)  
           
颛孙安康
2023-03-14

解决方案不正确是因为你的算法错了。

首先,让我给你看一个反例。设A={2,1,2}。第一次迭代:base=0fibot=0sum=1 没错。第二个:base=0,fibot=1,sum=2。这也是正确的。最后一步:fibot=2check[A[fibot]]为true,因此,base=2。但它应该是1。因此,您的代码返回的是正确答案,而您的代码返回的是正确答案。

正确的方法可能是这样的:从L=0开始。对于从0到n-1的每个R,请将L一直向右移动,直到子数组只包含不同的值(您可以保持数组中每个值的出现次数,并使用这样一个事实,即A[R]是唯一可以出现多次的元素)。

您的代码还有一个问题:如果测试平台上的int是32位类型(例如,如果A的所有元素都不同),那么sum变量可能会溢出。

至于你的算法为什么不正确的问题,我不知道为什么它首先应该是正确的。你能证明吗?在我看来,base=fibot的赋值非常随意。

 类似资料:
  • 我解决了以下提供的协同问题。 给出了一个整数M和一个由N个非负整数组成的非空数组A。数组A中的所有整数都小于或等于M。 一对整数(P, Q),使得0≤P≤Q 例如,考虑整数M=6和数组A,这样: 目标是计算不同切片的数量。 编写函数: 类解决方案{公共int解决方案(int M,int[]A);} 如果给定一个整数M和一个由N个整数组成的非空数组a,则返回不同的片数。 如果不同切片的数量大于1,0

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

  • 问题内容: 我正在尝试编写一个小程序,该程序在数组中打印出不同的数字。例如,如果用户输入1,1,3,5,7,4,3,则该程序将仅打印出1,3,5,7,4。 我在else if函数中遇到错误。 到目前为止,这是我的代码: 问题答案: 首先,“ ”语句是不正确的,因为您没有为if提供任何条件(如果需要if,则需要编写“ ”)。 其次,您不能 在内部 循环中决定是否应打印一个值:代码的工作方式是 为每个

  • 我试图在火花数据帧中显示几个不同列的不同计数,以及对第一列进行分组后的记录计数。 所以如果我有col1、col2和col3,我想按col1分组,然后显示col2的不同计数和col3的不同计数。然后,我想在col1的同一组之后显示记录计数。最后,在一个agg语句中完成这一切…有什么想法吗?

  • 问题内容: 我有如下的对象数组: 我想计算不同值的出现次数,例如: 假设有3次出现,并且有2次出现。 我正在做。我能够像使用此答案那样获得不同的价值。 首选ES6语法。 问题答案: 您将需要知道计数属于哪个名称,所以我建议不要输出不提供任何线索的数组,而要输出一个以名称为键并以值作为对应值的对象:

  • 问题H[最长自然后继数]如果第二个是自然数序列中第一个的后继数(1和2是自然后继数),则两个连续的整数是自然后继数。编写一个程序,读取一个数字N,后跟N个整数,然后打印连续自然后继的最长序列的长度。示例: 输入 7 2 3 5 6 7 9 10输出3这里是我的代码到目前为止有人能帮我吗