Java实现 数组匹配,矩阵行排序

分两个长度相等的经致数组 persons 和 prizes,其中 persons[i] 是初始队列里第 i 名员工欢的奖品 (i =0 是队首位置), prizes[j],这个过程会一直持续到队列没有员工,或所有剩余员工都不喜欢最顶上的奖品为止。是第了个奖品的英型(j0表示最顶上)请适回无法取到自己密欢的奖品的员工致量。
lass
示例1
输入 : persons = [0,1,1,0,1], prizes = [1,0,0,1,0]
队首的员工放奔最顶上的奖品,并回到队列的末尾,队列变为 persons = [1,1,0,1,@]。
输出:队首的员工拿走最顶上的奖品,并离开队列,队列变为 persons = [1,0,1,0],奖品为 prizes = [o,0,1,0]的释:队首的员工放弃最顶上的奖品,并回到队列的末尾,队列变为 persons = [,1,0,1]。队首的员工拿走最顶上的奖品,并离开队列,队列变为 persons = [1,0,1],奖品为 prizes = [e,1,0]。队首的员工放奔最顶上的奖品,并回到队列的末尾,队列变为 persons = [e,1,1]。队首的员工拿走最顶上的奖品,并离开队列,队列变为 persons = [1,1],奖品为 prizes = []e]。-队首的员工拿走最顶上的奖品,并离开队列,队列变为 persons = [1],奖品为 prizes = [e]。最后剩余的 名员工不喜欢最顶上的奖品,因此返回 1。
示例2:
输入: persons = [1,0,0,1,0], prizes = [0,0,1,0,1]
输出:0

题目是识别的,凑合着看吧

private static int getNumWithoutPrize(int[] persons,int[] prizes){
//        System.out.println("------------------------------");
//        int res = 0;
        Queue<Integer> que = new LinkedList();
        int pPrize = 0;
        //遍历person
        for(int pers = 0; pers<persons.length; pers++){
            //没找到想要的礼物
            if(persons[pers] != prizes[pPrize]){
                que.add(persons[pers]);
            }else{
                //找到
                pPrize++;
                continue;
            }
        }
        int queSize = 0;
        int i=0;
        while(!que.isEmpty()){
            int tmp = (int)que.poll();
            queSize = que.size();

            if(tmp == prizes[pPrize]){
                pPrize++;
                i=0;
            }else{
                i++;
                que.add(tmp);
                if(queSize<=i)
                    break;
            }
        }

        return que.size();
    }

解目:因为同一型门的所有员工必须乘同一辆车,所以必须选择核载人数大于等于部门人数的车辆局出:0
日斯目法述
1 万至 plans0] 最少的要空位为: (12-10)+(8-8)+(15-15)=2dept0]10选用plans0]2]的车型,其核人数为12,大于等于10opt(1]e8这用plans(0[0]的车型,其核载人数为8,大于等于8lepts2]15选用 plans(0]1]的车型,其核载人数为 15大等于15空位为: (15-10)+(15 8)+(15-15)= 12注意:1)只使用了核载人数 15 的车型(不同部门可租同一型号的车),其他车型未使用方至plans(1]最少的deptsl1]两个部门,不能搭乘在一个核载人数为20的车上2)不允许扔车,如:depts(0方 plans2] 最少的总空位为:(15-10)+(8-8)+(15-15)=5方案0、1、2的总空位分别是2、12、5,因此选择 plans[0],返回下标0
东例2
融人: depts =[5, 9]plans = [[4],[6, 10),[5, 11]
称出:1)方 plans(0]无法满足搭乘条件2)方 plansl1]最少的空位为: (6-5)+(10-9)=2:3)方 plans/2]最少的总空位为: (5-5)+(11-9)=2plans[1]和 plans[2]的最少空位均为 2,返回其中下标最小的 1
示例3;
输入: depts= [10,10]plans = [[2, 9,8, 31.[7]]
解释:由于同一部门的所有员工需要搭乘同一辆车,不允许将同一部门的员工拆分乘坐,所给方案中最大的车型核载人数不足 10人,因此没有符合要
输出: -]
求的方案,返回-1。

private static int rentCars(int[] depts,int[][] plans){
        int res = 0;
        Arrays.sort(depts);//对部门升序排序
        int plansNum = plans.length;
        for(int i=0;i<plansNum;i++)
            Arrays.sort(plans[i]);//对方案升序排序

        int[] min = new int[plansNum];
        for(int i=0;i<min.length;i++){
            min[i] = Integer.MAX_VALUE;
        }

        //遍历方案
        for(int i=0;i<plansNum;i++){
            int pPlan = 0;//每次方案指针重置为0
            int pDep = 0;//部门同
            while(pDep < depts.length && pPlan<plans[i].length){
                //<= 坐得下的情况
                if(depts[pDep] <= plans[i][pPlan]){
                    int tmp = plans[i][pPlan] - depts[pDep];
                    if(min[i]==Integer.MAX_VALUE){
                        min[i] = tmp;
                    }else{
                        min[i] += tmp;//统计差值
                    }
                    pDep++;//下一个部门
                }else{
                    //坐不下
                    pPlan++;//考虑下一个更大的车
                }
            }
        }

        int tmp = Integer.MAX_VALUE;
        for(int i=0;i<min.length;i++){
            if(min[i]<tmp){
                tmp = min[i];
                res = i;
            }
        }

        return  res;
    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

asjodnobfy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值