源地址
https://app.codility.com/programmers/lessons/4-counting_elements/frog_river_one/
FrogRiverOne(青蛙渡河)
一只小青蛙想到河对岸去。青蛙初始是在河的这边(位置0),想去河的另一边(位置X+1),树叶从树上落到河面上。
给定一个包含N个整数的数组A,代表这些落下的叶子。A[K]代表在时间K落下的那片叶子的位置。
目标是找到青蛙跳到对岸的最快时间。只有叶子出现在从1到X的每个位置的时候青蛙才能通过(也就是,我们找到最早的时刻,当从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个整数的非空数组A和一个整数X,返回青蛙能跳过河的最早时间。
如果青蛙不能跳到另一边,那么返回-1。
比如,给定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。
假设:
- N和X是范围[1…100,000]中的整数。
- 数组A中的每个元素都是在范围[1…X]中的整数。
第一步
建立一个长度为X+1的数组。将数组A中的某个数字P第一次出现的位置放入新数组中。完成之后,如果新数组中除去下标为0的位置,其他位置有为0的情况,那么返回-1。如果都有数字,那么返回最大值即可。
public int solution(int X, int[] A) {
int len = A.length;
int[] B = new int[X + 1];
Arrays.fill(B, -1);
for (int i = 0; i < len; i++) {
if (B[A[i]] == -1) {
B[A[i]] = i;
} else {
B[A[i]] = Math.min(B[A[i]], i);
}
}
for (int i = 1; i <= X; i++) {
if (B[i] == -1) {
return -1;
}
}
for (int i = 1; i <= X; i++) {
if (i < X && B[i] > B[i + 1]) {
int temp = B[i];
B[i] = B[i + 1];
B[i + 1] = temp;
}
}
return B[X];
}