分两个长度相等的经致数组 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; }