题解 | #手套#

手套

https://www.nowcoder.com/practice/365d5722fff640a0b6684391153e58d8

import java.util.*;

public class Gloves {
    public int findMinimum(int n, int[] left, int[] right) {
        int count=0;//定义出现0的情况先.需要先拿几只手套,来简化问题
        int leftSum=0;//左右手手套数量的和
        int rightSum=0;
        int leftMin=Integer.MAX_VALUE;;//左右手手套数量的最小值,一定要定义最大的,这样才能更新得到数组中的最小值,定义为0的话,直接不用比较了,最后的最小值一定是0
        int rightMin=Integer.MAX_VALUE;;
        for(int i=0;i<n;i++){
            if(left[i]*right[i]==0){//出现颜色为0的情况
            count+=left[i]+right[i];//因为不知道是那一只手为0,所以全部加,反正为0,只加另一只手
            }else{//这里处理的是所有的非0的颜色的情况(越过了包含0的下标,不算进去)-->正常情况的,简化了的
            leftSum+=left[i];
            if(leftMin>left[i]){
                leftMin=left[i];//更新最小值
            }
            rightSum+=right[i];
            if(rightMin>right[i]){
                rightMin=right[i];//更新最小值
            }
            }
        }
        //得到了左边的sum,及min及要先拿走的属于0的颜色(右边也一样)
        int minNum=Math.min(leftSum-leftMin+1,rightSum-rightMin+1)+1;//得到简化后的正常所情况需拿的手套数量,拿完,加一
        return count+minNum;//最后的数量是简化后的加上提前拿走的
    }
}

一定能凑出,而且还要最少:所有的最坏的情况发生,然后在最坏情况发生后,只要拿到一次满足条件的手套即可,不再多拿

--->正常情况:没有空白手套的情况:即所有的手套都至少要一只对应(左右手)

--->怎么样才能保证一定能凑出一双手套?

--->发生最坏的情况:左手的拿了4+3+2+1=10只-->所有的颜色(最少的拿种颜色拿一只即可,最坏的情况是把数量多的全部拿了,最后才轮到数量最少的)

--->然后右手随便拿一只即可-->1

--->一共11只必然凑出一双

--->又或者:右手拿了5+3+2+1=11只--->拿到了所有的颜色

--->左手随便拿一只-->1

一共12只必然凑出一双

--->比较左/右手拿完的两种情况最小值,结果取最小即可

---->怎么才能得出某一只手需要几只手套才能一定凑出所有的颜色:所有的手套数量求和,然后减去最小的数量,然后加一(减去最小的,代表现在只剩最小数量的那种颜色没有拿了,+1代表拿了最小数量的那种颜色的手套)

---->2+3+2+4-1+1=10

--->不正常情况:

左右手出现了单独的手套,即某种颜色只有0只的情况

--->我们首先得把0只手套的手对应的另外一只手的颜色全部拿完

--->如:左手0右手1,把1拿了,右手0左手1,把1拿了--->所以先提前拿了2

--->然后就可以简化题目了

--->因为拿了单独手套的颜色的话,它是一定不能凑出一对的,所以这是坏的情况,把它拿了就去掉坏的情况了

--->有0的那只手,即便你拿了所有的颜色,另外一只手只要拿0对应的颜色,就永远凑不出一对,所以必须得先把0对应的颜色拿完,再拿其他颜色才能凑出

---->简化后左右手都只剩两种颜色了,按照正常情况求出要拿多少只即可

--->最后把2加上剩下的正常情况的即可:2+8=10只

全部评论
import java.util.*; public class Gloves { public int findMinimum(int n, int[] left, int[] right) { int ret = 0; for (int i = 0; i < left.length; i++) { if (left[i] == 0) { //处理异常情况 ret += right[i]; right[i] = 0; } if (right[i] == 0) { ret += left[i]; left[i] = 0; } } int leftMin = Arrays.stream(left).filter(num -> num != 0) .min().orElse(0);//找不到最小值返回0 int rightMin = Arrays.stream(right).filter(num -> num != 0) .min().orElse(0); int leftSum = Arrays.stream(left).sum(); int rightSum = Arrays.stream(right).sum(); if (leftSum < rightSum) { return leftSum - leftMin + 2 + ret; } else { return rightSum - rightMin + 2 + ret; } } }
点赞 回复 分享
发布于 2023-10-18 20:27 陕西
老铁,你真牛,点赞
点赞 回复 分享
发布于 2023-10-18 00:22 广东

相关推荐

面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗&nbsp;&nbsp;他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了&nbsp;&nbsp;好好准备,等待明天的影石360和周四的腾讯了&nbsp;&nbsp;加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务