Lesson 4 Question 2 FrogRiverOne

源地址

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];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值