手套---牛客网
class Gloves { public: int findMinimum(int n, vector<int> left, vector<int> right) { int sum=0; int left_sum = 0, left_min = INT_MAX; int right_sum = 0, right_min = INT_MAX; for(int i=0;i<n;i++) { if(left[i]*right[i]==0)//如果这其中有0 就是没有匹配的手套 不用纳入计算 { sum+=left[i]+right[i];//加上这些没有匹配的剩余手套 保证把他们全拿到后,再拿一个,就是保证至少能拿到一个能匹配的手套 } else { left_sum+=left[i];//左边的全部值 left_min=left_min<left[i]?left_min:left[i];//计算左边的最小值 不包括0 right_sum+=right[i];//右边的全部值 right_min=right_min<right[i]?right_min:right[i];//计算右边的最小值 不包括0 } } //sum为不能匹配的手套个数 加上某一边能全部覆盖所有手套,并且为最小值. 最后加上另一变的随便一个手套 则为最小值(记住 sum已经排除掉不能匹配的所有手套 所以再拿一个必定拿到能匹配的手套) // return sum+min(left_sum-left_min+1,right_sum-right_min+1)+1; } };
left[i] 和right[i] 是匹配的数值 0 和 1 左边0个 右边1个
因为数据中有0这种数值 说明有不能匹配的手套。所以这些手套必须加上 避免没有全拿时 拿到了不匹配的手套。
思路 :拿到左边或者右边能覆盖的值 比较左边和右边哪个小 选出来后 选另一边的一只即可 (再加上那些容错率的不匹配的手套,提高容错率,保证最后另一边拿的一只必定是能匹配的手套)
和拿一边的全部再拿另一边的一只很像。 只不过此题要计算两边中一边能覆盖的最小值 加上不能匹配的容错 再拿另一边的一只
扩展 要计算能覆盖某一组数据 并且是最小值的公式: 总和-最小值+1
例子[0,7,1,6],[4,5,0,6]
左边:14-1+1=14 :也就是必须拿完才能全部覆盖 总和就是最小值
右边: 15-4+1=12:随便拿12个即可覆盖所有数值