【算法】青蛙从河边跳到对岸,河中需要依次落满树叶
Codility中有这样一个算法题,是说一只青蛙从河边(position = 0) 跳到河的对面去 (position: x + 1), 河边有棵树,会在不同的时间点(以秒计算)落下树叶在河面上,我们需要保证河面上从position=1到position=x的位置全部落满了树叶时(在某一个时间点 time = t秒时),青蛙就会起跳,我们现在需要获取这个跳的时间点n. 英文全文是这样的
A small frog wants to get to the other side of a river. The frog is initially located on one bank of the river (position 0) and wants to get to the opposite bank (position X+1). Leaves fall from a tree onto the surface of the river. You are given an array A consisting of N integers representing the falling leaves. A[K] represents the position where one leaf falls at time K, measured in seconds. The goal is to find the earliest time when the frog can jump to the other side of the river. The frog can cross only when leaves appear at every position across the river from 1 to X (that is, we want to find the earliest moment when all the positions from 1 to X are covered by leaves). You may assume that the speed of the current in the river is negligibly small, i.e. the leaves do not change their positions once they fall in the river. For example, you are given integer X = 5 and array A such that: A[0] = 1 A[1] = 3 A[2] = 1 A[3] = 4 A[4] = 2 A[5] = 3 A[6] = 5 A[7] = 4 In second 6, a leaf falls into position 5. This is the earliest time when leaves appear in every position across the river. Write a function: class Solution { public int solution(int X, int[] A); } that, given a non-empty array A consisting of N integers and integer X, returns the earliest time when the frog can jump to the other side of the river. If the frog is never able to jump to the other side of the river, the function should return −1. For example, given X = 5 and array A such that: A[0] = 1 A[1] = 3 A[2] = 1 A[3] = 4 A[4] = 2 A[5] = 3 A[6] = 5 A[7] = 4 the function should return 6, as explained above. Write an efficient algorithm for the following assumptions: N and X are integers within the range [1..100,000]; each element of array A is an integer within the range [1..X].
为了节省时间,我这里直接写出解题思路:
这个题目其实就是说对于数组A[N] (包括N个元素的数组), 它的值会包括1,2,3,,,X的值,我们需要算出这些数字(1-X)都完全出现在数组中时,这个时候对应的数组的下标
解题思路:
对数组A[N]进行循环,把值加入到另一个数组B[]中,如果数组B中已经存在这个值,那么就不再加入,这样保证数组B中没有重复的值。然后接下来计算数组B的长度,如果B的长度=X, 那么这个时候的数组A的下标,就是我们需要的返回值