一个Codility上的练习遇到和预期结果不同的问题。
2014-08-11 21:02
489 查看
前几天有空的时候挑战了一个AMBITIOUS的题目 Prime and composite number条目下面的Flags。
题目如下:
A non-empty zero-indexed array A consisting of N integers is given. A peak is an array element which is larger than its neighbours. More precisely, it is an index P such that 0 < P < N ? 1 and A[P ? 1] < A[P] > A[P + 1].
For example, the following array A:
A[0] = 1
A[1] = 5
A[2] = 3
A[3] = 4
A[4] = 3
A[5] = 4
A[6] = 1
A[7] = 2
A[8] = 3
A[9] = 4
A[10] = 6
A[11] = 2
has exactly four peaks: elements 1, 3, 5 and 10.
You are going on a trip to a range of mountains whose relative heights are represented by array A, as shown in a figure below. You have to choose how many flags you should take with you. The goal is to set the maximum number of flags on the peaks, according
to certain rules.
Flags can only be set on peaks. What's more, if you take K flags, then the distance between any two flags should be greater than or equal to K. The distance between indices P and Q is the absolute value |P ? Q|.
For example, given the mountain range represented by array A, above, with N = 12, if you take:
two flags, you can set them on peaks 1 and 5;
three flags, you can set them on peaks 1, 5 and 10;
four flags, you can set only three flags, on peaks 1, 5 and 10.
You can therefore set a maximum of three flags in this case.
Write a function:
int solution(vector<int> &A);
that, given a non-empty zero-indexed array A of N integers, returns the maximum number of flags that can be set on the peaks of the array.
For example, the following array A:
A[0] = 1
A[1] = 5
A[2] = 3
A[3] = 4
A[4] = 3
A[5] = 4
A[6] = 1
A[7] = 2
A[8] = 3
A[9] = 4
A[10] = 6
A[11] = 2
the function should return 3, as explained above.
Assume that:
N is an integer within the range [1..200,000];
each element of array A is an integer within the range [0..1,000,000,000].
Complexity:
expected worst-case time complexity is O(N);
expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).
Elements of input arrays can be modified.
如下是网上的其他人的实现结果:
// you can use includes, for example:
#include <algorithm>
#include <cmath>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
int solution(vector<int> &A) {
// write your code in C++11
int N = A.size();
vector<int> B(N,0);
int pos = 0;
int num = 0;
int res = 0;
for(int i=1;i<N-1;++i)
{
if((A[i]>A[i-1])&&(A[i]>A[i+1]))
B[i]=1;
}
vector<int> C(N,-1);
//C[N-1] = -1;//C[N-2] = -1;
for(int i=N-2;i>-1;--i)
{
if(B[i])
C[i] = i;
else
C[i] = C[i+1];
}
for(int i=1;i<=sqrt(N)+1;++i)
{
pos = 0;
num = 0;
while(pos<N&&num<i)
{
pos = C[pos];
if(pos == -1)
break;
pos += i;
num++;
}
res = max(res,num);
}
return res;
}
我自己开始的时候形成了思路实现方式和上面的方式非常像,但是总是不能得到100%的结果检验的正确率。
int solution(vector<int> &A) {
// write your code in C++11
vector<int> peaks;
int result=0;
for(unsigned int i=1;i<A.size()-1;i++)
{
if((A[i]>A[i-1]) && (A[i]>A[i+1]))
{
peaks.push_back(i);
i++;
}
}
for (unsigned int k=1; (k<=peaks.size())&&(k*k<A.size()); k++)
{
int flags=1;
int posA=0;
int posB=1;
while((flags<=k) && (posB<peaks.size()))
{
if( peaks[posB]-peaks[posA] >= k )
{
flags++;
posA=posB;
posB++;
}
else
{
posB++;
}
}
result=max(flags,result);
}
return result;
}
得到的结果不能100%正确,思考了很久也不能确定问题出在哪里。下图是结果
求高手指点。
题目如下:
A non-empty zero-indexed array A consisting of N integers is given. A peak is an array element which is larger than its neighbours. More precisely, it is an index P such that 0 < P < N ? 1 and A[P ? 1] < A[P] > A[P + 1].
For example, the following array A:
A[0] = 1
A[1] = 5
A[2] = 3
A[3] = 4
A[4] = 3
A[5] = 4
A[6] = 1
A[7] = 2
A[8] = 3
A[9] = 4
A[10] = 6
A[11] = 2
has exactly four peaks: elements 1, 3, 5 and 10.
You are going on a trip to a range of mountains whose relative heights are represented by array A, as shown in a figure below. You have to choose how many flags you should take with you. The goal is to set the maximum number of flags on the peaks, according
to certain rules.
Flags can only be set on peaks. What's more, if you take K flags, then the distance between any two flags should be greater than or equal to K. The distance between indices P and Q is the absolute value |P ? Q|.
For example, given the mountain range represented by array A, above, with N = 12, if you take:
two flags, you can set them on peaks 1 and 5;
three flags, you can set them on peaks 1, 5 and 10;
four flags, you can set only three flags, on peaks 1, 5 and 10.
You can therefore set a maximum of three flags in this case.
Write a function:
int solution(vector<int> &A);
that, given a non-empty zero-indexed array A of N integers, returns the maximum number of flags that can be set on the peaks of the array.
For example, the following array A:
A[0] = 1
A[1] = 5
A[2] = 3
A[3] = 4
A[4] = 3
A[5] = 4
A[6] = 1
A[7] = 2
A[8] = 3
A[9] = 4
A[10] = 6
A[11] = 2
the function should return 3, as explained above.
Assume that:
N is an integer within the range [1..200,000];
each element of array A is an integer within the range [0..1,000,000,000].
Complexity:
expected worst-case time complexity is O(N);
expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).
Elements of input arrays can be modified.
如下是网上的其他人的实现结果:
// you can use includes, for example:
#include <algorithm>
#include <cmath>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
int solution(vector<int> &A) {
// write your code in C++11
int N = A.size();
vector<int> B(N,0);
int pos = 0;
int num = 0;
int res = 0;
for(int i=1;i<N-1;++i)
{
if((A[i]>A[i-1])&&(A[i]>A[i+1]))
B[i]=1;
}
vector<int> C(N,-1);
//C[N-1] = -1;//C[N-2] = -1;
for(int i=N-2;i>-1;--i)
{
if(B[i])
C[i] = i;
else
C[i] = C[i+1];
}
for(int i=1;i<=sqrt(N)+1;++i)
{
pos = 0;
num = 0;
while(pos<N&&num<i)
{
pos = C[pos];
if(pos == -1)
break;
pos += i;
num++;
}
res = max(res,num);
}
return res;
}
我自己开始的时候形成了思路实现方式和上面的方式非常像,但是总是不能得到100%的结果检验的正确率。
int solution(vector<int> &A) {
// write your code in C++11
vector<int> peaks;
int result=0;
for(unsigned int i=1;i<A.size()-1;i++)
{
if((A[i]>A[i-1]) && (A[i]>A[i+1]))
{
peaks.push_back(i);
i++;
}
}
for (unsigned int k=1; (k<=peaks.size())&&(k*k<A.size()); k++)
{
int flags=1;
int posA=0;
int posB=1;
while((flags<=k) && (posB<peaks.size()))
{
if( peaks[posB]-peaks[posA] >= k )
{
flags++;
posA=posB;
posB++;
}
else
{
posB++;
}
}
result=max(flags,result);
}
return result;
}
得到的结果不能100%正确,思考了很久也不能确定问题出在哪里。下图是结果
求高手指点。
相关文章推荐
- 遇到一个debug版本和release版本运行结果不同的问题
- debug和release编译结果在多线程的遇到的一个问题
- 遇到了一个HttpURLConnection乱码问题:结果是JVM file.encoding错误
- 一个C++复制构造函数在不同编译器上(xcode,linux终端,VC6.0)出现结果不一致的问题
- 一个C++复制构造函数例题在不同编译器上(xcode,CodeWarrior,GUN,VC6.0)出现结果不一致的问题
- 【遇到的问题】想写一个通用的adapter,样式一样但是数据源是不同的,怎么做
- 一个关于SQL的问题,做做看,好想跟经常遇到的有点不同
- Android 获取屏幕尺寸与密度 遇到一个问题,我的地图浮标图片在WVGA手机上正好,在QVGA上就显的太大,所以我要根据屏幕的不同调整浮标的大小使其在QVGA大小合适。有的同事提出了依据
- HashMap与Hashtable的区别是面试中经常遇到的一个问题。这个问题看似简单,但如果深究进去,也能了解到不少知识。本文对两者从来源、特性、算法等多个方面进行对比总结。力争多角度、全方位的展示二者的不同,做到此问题的终结版。
- 练习Eclipse RCP遇到的一个问题及思考
- 关于Android DES加密算法在不同平台加密结果不同的问题的一个解决方法
- 遇到一个gcc编译器版本导致的运行结果有差异的问题
- 一个C++复制构造函数例题在不同编译器上(xcode,CodeWarrior,GUN,VC6.0)出现结果不一致的问题
- 标准库c++ string,转c string容易犯的一个错误。求此问题为什么在windows下和linux下结果不同???
- 使用ODBC和OLEDB两种方式执行同一个存储过程,结果不同的问题!
- 使用css expression遇到的一个问题
- 昨天下午遇到一个问题,到晚上才解决。
- 安装 Visual Stdio.net 2003 时遇到的一个问题
- 今天用 hbm2ddl 生成数据库脚本时,不明不白地遇到了一个问题又糊里糊涂解决了
- 今天遇到的一个奇怪的vb.net问题