题解 | #手套#

手套

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

解题思路:

  1. 有0的情况: 如果数组中的某个元素为0,那么就代表着有一边手套颜色的数量为0。假设是左边手套的某种颜色数量为0,右边不为0,此时最终结果ret += 不为0的数。即有一端为0,另一端不为0,ret 就要加上不为0的那一端的数量。为什么呢?因为是天黑的情况,拿手套的人根本知道是否哪种颜色为0,所以对应位置的手套要全拿,以防出现最坏情况。
  • 对于0的情况,我又思考了一番,我的理解是这样的:

  1. 其他情况:从左边求出总和,然后减去左边最小数量的颜色,再+1,即为左边所有的手套都可以覆盖到。同理,右边也是如此。最后,把为0的情况 + min(左边手套数量,右边手套数量) + 1 即为最终结果。
class Gloves {
public:
    int findMinimum(int n, vector<int> left, vector<int> right) {
        // write code here
        int sumr = 0, minr = INT_MAX;
        int suml = 0, minl = INT_MAX;
        int ret = 0;
        for(int i = 0; i < n; i++)
        {
            //若有一边手套颜色为0,另一边需要全拿,因为天黑我知道是否有为0
            if(left[i] == 0 || right[i] == 0)
            {
                ret += left[i] + right[i];
            }
            else
            {
                sumr += right[i];
                minr = min(right[i],minr);
                suml += left[i];
                minl = min(left[i],minl);
            }
        }
        sumr = sumr - minr + 1;
        suml = suml - minl + 1;
        return ret + min(sumr,suml) + 1;
    }
};

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务