我正在写一个关于C++编码的练习。这里的问题:
给出一个由N个数字组成的非空零索引数组A。数组按非降序排序。此数组的绝对非重复计数是数组元素中的非重复绝对值的数量。
例如,考虑数组A,使得:
A[0] = -5
A[1] = -3
A[2] = -1
A[3] = 0
A[4] = 3
A[5] = 6
这个数组的绝对非重复计数是5,因为这个数组的元素中有5个不同的绝对值,即0,1,3,5和6。
写一个函数:int solution(vector<int> &A);
给定一个由N个数字组成的非空零索引数组A,返回数组A的绝对非重复计数。
例如,给定数组A,使得:
A[0] = -5
A[1] = -3
A[2] = -1
A[3] = 0
A[4] = 3
A[5] = 6
如上所述,该函数应该返回5。
假设:N
是范围[1..100,000]
内的整数;
数组A
的每个元素是范围[−2,147,483,648..2,147,483,647]
内的整数;
数组A
以非降序排序。
复杂度:
预期的最坏情况时间复杂度为O(N);
预期的最坏情况空间复杂度为O(N)
,超出输入存储(不计算输入参数所需的存储)。
可以修改输入数组的元素。
我写了下面的代码,我没有发现我的代码中有任何问题,但它就是不通过。
#include <algorithm>
#include <vector>
#include <cmath>
int solution(vector<int> &A) {
int N(A.size());
vector<long long> B(N,0);
int counter(1);
//int index(0);
int move1(0);
int move2(N-1);
if(N==1)
{return 1;}
if(N==0)
{return 0;}
if(N==2)
{
if(abs(A[0])==abs(A[1]))
{return 1;}
else{return 2;}
}
for (int i = 0 ; i < N ; ++i)
{
B[i]=abs((long long )A[i]);
}
while(move1<move2)
{
if(B[move1]==B[move1+1])
{move1+=1;}
else if(B[move2]==B[move2]-1)
{move2-=1;}
else if(B[move1]>B[move2])
{
counter+=1;
move1+=1;
}
else if(B[move1]<B[move2])
{
counter+=1;
move2-=1;
}
else{move1+=1;}
}
return counter;
}
下面是性能的链接,https://codility.com/demo/results/trainingUT9QAN-JMM/有一些错误,但我不能弄清楚它的细节,如果有人能帮助我与我的代码,我会非常感激!
谢谢!
5条答案
按热度按时间7uzetpgm1#
您可能希望有一个迭代的解决方案。从两端开始,向内朝0的方向工作。
ny6fqffe2#
100% Ruby解决方案
wkyowqbh3#
使用Java 8流获得100/100。
ecfsfe2w4#
nnsrf1az5#