2026/4/18 12:35:43
网站建设
项目流程
服装网站建设项目规划书,软件开发需要什么专业,无锡平台公司,wordpress导入商品输入#xff1a;
整数数组 hand 表示手里的牌面值整数 groupSize 表示每组顺子的长度
要求#xff1a;
把所有牌分成若干组每组必须是 groupSize 张连续牌能分完返回 true#xff0c;否则 false
输出#xff1a;
bool思路#xff1a;
这题的关键不是“怎么凑一组顺子”整数数组hand表示手里的牌面值整数groupSize表示每组顺子的长度要求把所有牌分成若干组每组必须是groupSize张连续牌能分完返回true否则false输出bool思路这题的关键不是“怎么凑一组顺子”而是如果能成功分组最小的牌一定只能作为某个顺子的起点它不可能被更小的牌带着走因为没有更小的了。所以策略很直接如果hand.size() % groupSize ! 0直接不可能。用mapint,int count统计每种牌出现次数map自动按牌面升序。从map.begin()开始扫每个牌startCard设num count[startCard]表示当前这个牌还剩多少张没被用掉。如果num 0说明我们必须以startCard作为起点开num个顺子需要把[startCard, startCard1, ..., startCardgroupSize-1]每个牌都扣掉num张若其中某张牌数量不足count[currentCard] num直接失败扫完不失败就成功。这个贪心的本质是先把最小牌“安置掉”否则后面无论怎么分组它都会卡死。复杂度时间复杂度O(N log N)建map和后续访问都是log级空间复杂度O(N)计数表classSolution{public:boolisNStraightHand(vectorinthand,intgroupSize){if((int)hand.size()%groupSize!0)returnfalse;mapint,intcount;for(intx:hand){count[x];}for(autoitcount.begin();it!count.end();it){intstartCardit-first;intnumit-second;if(num0){for(inti0;igroupSize;i){intcurstartCardi;if(count[cur]num)returnfalse;count[cur]-num;}}}returntrue;}};