我试图解决这个问题。
给出了一个整数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);
}
我想分享我用C语言实现的算法的解释,然后是实际实现。
这个解决方案的运行时复杂性是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;
}
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)
解决方案不正确是因为你的算法错了。
首先,让我给你看一个反例。设A={2,1,2}。第一次迭代:base=0
,fibot=0
,sum=1
没错。第二个:
base=0,fibot=1,sum=2。这也是正确的。最后一步:
fibot=2
,check[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这里是我的代码到目前为止有人能帮我吗