題目描述
在地下室裏放着n種顏色的手套,手套分左右手,但是每種顏色的左右手手套個數不一定相同。A先生現在要出門,所以他要去地下室選手套。但是昏暗的燈光讓他無法分辨手套的顏色,只能分辨出左右手。所以他會多拿一些手套,然後選出一雙顏色相同的左右手手套。現在的問題是,他至少要拿多少隻手套(左手加右手),才能保證一定能選出一雙顏色相同的手套。
給定顏色種數n(1≤n≤13),同時給定兩個長度爲n的數組left,right,分別代表每種顏色左右手手套的數量。數據保證左右的手套總數均不超過26,且一定存在至少一種合法方案。
測試樣例:
4,[0,7,1,6],[1,5,0,6]
**返回:10(解釋:可以左手手套取2只,右手手套取8只)
思路:**
* 1:把左手套全部拿出來,右手套選出一個,即可配對
* 2:把右手套全部拿出來,左手套選出一個,即可配對
* 但是這兩種方法缺乏一點考慮,1中從右手套中選出配左手套,有一種情況
* 左手套中可能有一種顏色爲0,而右手套卻有這種顏色,這時如果選擇這個右手套
* 就不可以配對,所以總數需要1+這類右手套的個數纔可成功配對,此外還有一點
* 需要考慮,就是只需要配對一個即成功,所以把左右手套都有的顏色中左手套個數
* 最少的手套數變爲1,因爲多了也是冗餘。2中類似。
* 程序中的max = max - min + 2可以理解爲
* max = max -(min - 1) + 1
import java.util.*;
public class Gloves {
public int findMinimum(int n, int[] left, int[] right) {
int max1 = 0,max2 = 0;
int min1 = 27,min2 = 27;//總手套數
int i;
for(i=0;i<n;i++){
if(left[i] == 0){
max1 = max1+right[i];
}
else{
max1 = max1+left[i];
}
if(right[i] == 0){
max2 = max2+left[i];
}
else{
max2 = max2+right[i];
}
if(left[i]!=0 && right[i]!=0 && left[i]<min1){
min1 = left[i];
}
if(right[i]!=0 && left[i]!=0 && right[i]<min2){
min2 = right[i];
}
}
max1 = max1-min1+2;
max2 = max2-min2+2;
return (max1<max2)?max1:max2;
}
}