贪心算法之取手套问题(牛客)
生活随笔
收集整理的這篇文章主要介紹了
贪心算法之取手套问题(牛客)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
解法框架
待定
手套
這道題的關(guān)鍵點(diǎn)如下
所以本題的解題思路就是,首先拿取左面或右面的手套,使拿取的數(shù)目覆蓋全部顏色,然后相應(yīng)的另一半手套只需挑出一即可
以拿出左面為例,有5只顏色不同的左手套
由于無(wú)法分辨顏色,所以拿取的時(shí)候,如果數(shù)目太小,就可能無(wú)法覆蓋全部手套。比如拿取15只手套,白色的可能就沒(méi)有覆蓋到。所以一旦左面取了15只,就白色的沒(méi)取,而右面取了一只,恰好就是白色,就導(dǎo)致無(wú)法匹配
而如果全取,就不能保證題目“至少”要求了
所以應(yīng)該這樣取:手套數(shù)目=總手套數(shù)目-最少的顏色的手套+1 。這樣取一定可以保證所有手套全部覆蓋到
如果一個(gè)手套中出現(xiàn)了0,那么將導(dǎo)致對(duì)應(yīng)的手套無(wú)法被匹配到,所以這種情況下要把0對(duì)應(yīng)的手套(不管是左還是右都取出來(lái)),才能保證不被這種糟糕的情況給破壞掉
最后應(yīng)該是取左面還是右面的呢?其實(shí)這不重要,左面小就取左面的,右面小就取右面的,最后只需在對(duì)方手套中取一只即可。
代碼
class Gloves { public:int findMinimum(int n, vector<int> left, vector<int> right) {int left_sum=0;int right_sum=0;//分別計(jì)算左面手套和右面手套的綜合int left_min=INT_MAX;int right_min=INT_MAX;//分別用來(lái)保存左面或者右面的最小手套數(shù)目int sum_zero=0;//統(tǒng)計(jì)一方出現(xiàn)手套為0的手套數(shù)目for(int i=0;i<n;i++)//有n種顏色的手套{if(left[i] * right[i] == 0)//只要一方有0,統(tǒng)計(jì){sum_zero+=left[i]+right[i];}else{left_sum+=left[i];//統(tǒng)計(jì)左手套的數(shù)目left_min=min(left_min,left[i]);//左手套中顏色最少的right_sum+=right[i];//同上right_min=min(right_min,right[i]);}}//誰(shuí)少取誰(shuí)int get=min(left_sum-left_min+1,right_sum-right_min+1);return sum_zero+get+1;//最后返回時(shí)只要任取對(duì)面的1個(gè)手套以及取完所有為0的情況和一方手套} };總結(jié)
以上是生活随笔為你收集整理的贪心算法之取手套问题(牛客)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: css 用direction来改变元素水
- 下一篇: JQ属性和css部分测试