大鱼吃小鱼

【题目】在水中有许多鱼,可以认为这些鱼停放在 x 轴上。再给定两个数组 Size,Dir,Size[i] 表示第 i 条鱼的大小,Dir[i] 表示鱼的方向 (0 表示向左游,1 表示向右游)。这两个数组分别表示鱼的大小和游动的方向,并且两个数组的长度相等。鱼的行为符合以下几个条件:

所有的鱼都同时开始游动,每次按照鱼的方向,都游动一个单位距离;

当方向相对时,大鱼会吃掉小鱼;

鱼的大小都不一样。

输入:Size = [4, 2, 5, 3, 1], Dir = [1, 1, 0, 0, 0]

输出:3

请完成以下接口来计算还剩下几条鱼?

package leetcode;

import java.util.Stack;

public class FishSolution {

    int fishSolution(int[] fishSize ,int[] fishDirection){
        //获取鱼的数量
        final int fishNumber = fishSize.length;
        //如果鱼的数量小于等于1,那么直接返回鱼的数量
        if(fishNumber <= 1){
            return fishNumber;
        }

        //0表示鱼向左游
        final int left = 0 ;
        // 1表示鱼向右游动
        final int right = 1;

        Stack<Integer> t = new Stack<>();
        for(int i= 0 ;i < fishNumber; i++){
            //当前鱼的情况: 1,游动方向,2大小
            final  int curFishDirection = fishDirection[i];
            final  int curFishSize = fishSize[i];

            //定义当前鱼是否被栈中的鱼吃掉
            boolean hasEat = false;

            //如果栈的还有鱼,并且栈中鱼向右,当前的鱼向左游,那么就会相遇的可能性
            while (!t.empty() && fishDirection[t.peek()] == right && curFishDirection == left){
                //如果栈顶的鱼比较大,那么把新的来的吃掉
                if(fishSize[t.peek()] > curFishSize){
                    hasEat = true;
                    break;
                }
                //如果栈中的鱼较小,那么会把栈中的鱼吃掉,栈中的鱼被消除,所以需要弹栈
                t.pop();
            }
            //如果新来的鱼,没有被吃掉,那么压入栈中
            if(!hasEat ){
                t.push(i);
            }
        }
      return t.size();
    }

    public static void main(String[] args){
        FishSolution fs = new FishSolution();
        int[] fishS= {1,2,3,4};
        int[] fishD ={0,1,0,0};
        int a =fs.fishSolution(fishS,fishD);
        System.out.println(a);

    }
}

 

posted on 2021-06-06 11:00  凌晨三点半的飞机  阅读(123)  评论(0编辑  收藏  举报