题解 | #手套#
手套
https://www.nowcoder.com/practice/365d5722fff640a0b6684391153e58d8
解题思路:
- 有0的情况: 如果数组中的某个元素为0,那么就代表着有一边手套颜色的数量为0。假设是左边手套的某种颜色数量为0,右边不为0,此时最终结果ret += 不为0的数。即有一端为0,另一端不为0,ret 就要加上不为0的那一端的数量。为什么呢?因为是天黑的情况,拿手套的人根本知道是否哪种颜色为0,所以对应位置的手套要全拿,以防出现最坏情况。
- 对于0的情况,我又思考了一番,我的理解是这样的:
- 其他情况:从左边求出总和,然后减去左边最小数量的颜色,再+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; } };