以下是上述练习的链接。
https://codility.com/demo/results/demoH5GMV3-PV8
以下是任务说明:
一只小青蛙想要到达河的另一边。青蛙目前位于0号位置,想要到达位置X.树叶从树上掉落到河面上。
给出一个非空零索引数组A,由表示落叶的N个整数组成。 A [K]表示一片叶子在时间K下降的位置,以分钟为单位测量。
目标是找到青蛙可以跳到河的另一边的最早时间。只有当叶子出现在从1到X的河对岸的每个位置时,青蛙才能穿过。
例如,给定整数X = 5和数组A,使得:
A[0] = 1
A[1] = 3
A[2] = 1
A[3] = 4
A[4] = 2
A[5] = 3
A[6] = 5
A[7] = 4
在第6分钟,一片叶子落到第5位。这是叶子出现在河对岸各个位置的最早时间。
写一个函数:
class Solution {public int solution(int X,int [] A); } 给定一个由N个整数和整数X组成的非空零索引数组A,返回青蛙可以跳到河的另一边的最早时间。
如果青蛙永远不能跳到河的另一边,那么该函数应该返回-1。
除了一个测试用例 - 大排列测试之外,我不明白代码如何给出可接受的答案。 我得到-1而不是90999。
int solution(int X, vector<int> &A) {
// write your code in C++11
int N = A.size();
long long target = (X + 1) * X / 2;
vector<int> mark;
mark.resize(X + 1, 0);
for(int i = 0; i < N; ++i){
if(mark[A[i]] == 0){
target -= A[i];
mark[A[i]] = 1;
}
if(target == 0)
return i;
}
return -1;
}
当我修改代码时:
int solution(int X, vector<int> &A) {
// write your code in C++11
int N = A.size();
int target = X;
vector<int> mark;
mark.resize(X + 1, 0);
for(int i = 0; i < N; ++i){
if(mark[A[i]] == 0){
--target;
mark[A[i]] = 1;
}
if(target == 0)
return i;
}
return -1;
}
它使测试用例正确。 任何人都可以解释原因吗?
答案 0 :(得分:3)
这条线完全没有意义:
long long target = (X + 1) * X / 2;
您在int
类型中进行了所有数学运算,没有理由将结果存储在long long
变量中。任何溢出都已经发生。
当然,您已经知道问题存在,因为您只更改了两行代码。
答案 1 :(得分:0)
此代码使用Java。它利用了1 + 2 + .. + n = n *(n + 1)/ 2的事实。
public static int solution(int X, int[] A){
int[] Y=new int[X]; // 0 if leaf dropped here before, else 1
int sum=X*(X+1)/2;
for (int i=0;(i<A.length);i++){
if (Y[A[i]-1]==0) { //the first time a leaf drops to this position
Y[A[i]-1]=1;
sum-=A[i];
if (sum==0) return i;
}
}
return -1;
}
答案 2 :(得分:0)
C ++,得分100.制作地图,然后检查地图的大小是否等于X
:D
#include <vector>
#include <map>
using namespace std;
int solution(int X, vector<int> &A) {
map<int, bool> m;
for (int i = 0; i < A.size(); i++) {
int element = A[i];
m[element] = true;
if (m.size() == X) {
return i;
}
}
return -1;
}
答案 3 :(得分:0)
此代码在Cpp中使用矢量,且时间复杂度为O(N)
int solution(int X, vector<int> &A) {
int length = -1;
std::vector<int>::iterator it;
int max = X; int i = 0;
std::vector<bool> visited;
visited.reserve(X+1);
visited.resize(X+1);
for (it=A.begin();it!=A.end();it++, i++) {
if(*it <= X) {
if(!visited.at(*it)) {
visited.at(*it) = true;
max--;
}
if(max == 0) {
length = it - A.begin();
break;
}
}
}
return length;
}