【每日算法Day 99】你们可能不知道只用20万赢到578万是什么概念
你们可能不知道只用 20 万赢到 578 万是什么概念。 我们一般只会用两个字来形容这种人:赌怪! 我经常说一句话,当年陈刀仔他能用 20 块赢到 3700 万,我 LBW 用 20 万赢到 500 万不是问题。 埋伏他一手,这个牌不能抢,这个牌不用抢,他死定了。 反手给一个超级加倍,闷声发大财。他也超级加倍?但是不用怕,他的牌赢不了我。 五六七八九十,两个炸,很牛逼这个牌,如果把这个 K 换成 J ,我这个牌将绝杀,但是换不得。 单走一个六,SB,直接把 K 走了。 走他一张 2 顶他。阿姨快点,阿姨,阿姨你 K 都不要吗?阿姨你快点啊!阿姨别磨磨蹭蹭的。 五六七八九十。打错了,应该打 2 的。 给阿姨倒杯茶好吧,阿姨给你倒一杯卡布奇诺。 给阿姨倒一杯卡布奇诺!开始你的炸弹秀,炸他炸他。漂亮! 十七张牌你能秒我?你能秒杀我?!你今天能十七张牌把卢本伟秒了,我!当!场!就把这个电脑屏幕吃掉!!!
题目链接
LeetCode 846. 一手顺子[1]
题目描述
爱丽丝有一手(hand)由整数数组给定的牌。
现在她想把牌重新排列成组,使得每个组的大小都是 W
,且由 W
张连续的牌组成。
如果她可以完成分组就返回 true
,否则返回 false
。
说明:
1 <= hand.length <= 10000
0 <= hand[i] <= 10^9
1 <= W <= hand.length
示例1
输入:
hand = [1,2,3,6,2,3,4,7,8], W = 3
输出:
true
解释:
爱丽丝的手牌可以被重新排列为 [1,2,3],[2,3,4],[6,7,8]。
示例2
输入:
hand = [1,2,3,4,5], W = 4
输出:
false
解释:
爱丽丝的手牌无法被重新排列成几个大小为 4 的组。
题解
巧用 map
这也是最直观的一个方法,用 map
来保存每个数出现的次数。
然后从最小的数开始,以它作为顺子的开头,然后看顺子里的数在不在 map
里,在就次数减一,不在就直接返回 false
。
接着重复上面步骤,最后直到 map
为空,最后返回 true
。
map
的特性就是你取它的第一个键值对,它的 key
就是最小的,这就很方便了。
排序统计
首先对手牌从小到大进行排序,然后从最小的开始,作为顺子开头,遍历之后的数。如果在数组里,并且没有被访问过,那么就标记为访问过了。
注意可以提前终止遍历,也就是如果发现某一个顺子还没遍历完,但是访问到的元素已经超过接在顺子后的数了,那就直接返回 false
。
排序统计2
这题还有个解法,来自于题解区网友
zhanzq
,感觉挺不错的。但是我没怎么看懂,如果谁看懂了请教教我。
网友题解[2]
代码
巧用 map(c++)
class Solution {public:bool isNStraightHand(vector<int>& hand, int W) {int n = hand.size();if (n%W) return false;map<int, int> count;for (auto x : hand) count[x]++;while (count.size()) {int start = count.begin()->first;for (int i = start; i < start+W; ++i) {if (count.find(i) == count.end()) return false;if (!--count[i]) count.erase(i);}}return true;}
};
排序统计(c++)
class Solution {public:bool isNStraightHand(vector<int>& hand, int W) {int n = hand.size();if (n%W) return false;if (W==1) return true;sort(hand.begin(), hand.end());vector<int> vis(n, 0);for (int i = 0; i < n; ++i) {if (vis[i]) continue;int cnt = 1;vis[i] = 1;for (int j = i+1; j < n; ++j) {if (hand[j]>hand[i]+cnt) break;if (!vis[j] && hand[j]==hand[i]+cnt) {vis[j] = 1;cnt++;if (cnt == W) break;}}if (cnt != W) return false;}return true;}
};
排序统计2,来自于网友zhanzq(c++)
class Solution {public:bool valid(vector<int> &lst, int W){lst.push_back(0);int sz = lst.size();int pre = 0;vector<int> deltas(sz, 0);for(int i = 0; i < sz; i++){pre += deltas[i];if(pre < lst[i]){int delta = lst[i] - pre;pre = lst[i];if(i + W < sz){deltas[i+W] -= delta;}}else if(pre > lst[i]){return false;}}return true;}bool isNStraightHand(vector<int>& hand, int W) {int sz = hand.size();if(sz%W){return false;}else{sort(hand.begin(), hand.end());vector<int> lst;int i = 0, j = 0;while(i < sz){while(j < sz && hand[i] == hand[j]){j++;}lst.push_back(j - i);if(j >= sz){break;}else if(hand[j] != hand[j-1] + 1){lst.push_back(0);}i = j;}return valid(lst, W);}}
};
参考资料
[1]
LeetCode 846. 一手顺子: https://leetcode-cn.com/problems/hand-of-straights/
[2]
网友题解: https://leetcode-cn.com/problems/hand-of-straights/solution/onlognsuan-fa-by-zhanzq/
【每日算法Day 99】你们可能不知道只用20万赢到578万是什么概念相关推荐
- 每日算法C语言1-求某整数
每日算法C语言 题目 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析: 在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方如 ...
- 【每日算法】C语言8大经典排序算法(2)
接上文--->[每日算法]C语言8大经典排序算法(1) 二.插入类排序 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中 ...
- java回文数算法for_【Java】【每日算法/刷穿 LeetCode】9. 回文数(简单)
首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]9. 回文数(简单) 宫水三叶发布于 今天 15:30 题目描述 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从 ...
- 如何判断数组所有数都不等于一个数_【每日算法Day 91】求解数组中出现次数超过1/3的那个数
题目链接 LeetCode 229. 求众数 II[1] 题目描述 给定一个大小为 的数组,找出其中所有出现超过 次的元素. 说明: 要求算法的时间复杂度为 ,空间复杂度为 . 示例1 输入: [3, ...
- 消除左递归c++代码_【每日算法Day 85】图解算法:一行代码解决约瑟夫环的变体...
题目链接 LeetCode 390. 消除游戏[1] 题目描述 给定一个从 到 排序的整数列表. 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾. 第二步,在剩下的数字中,从右 ...
- 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符
题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...
- python 旋转矩阵_【每日算法Day 93】不用额外空间,你会旋转一个矩阵吗?
第 100 天时,我可能会对这 100 天以来的算法题进行一个总结,然后暂时停止更新 LeetCode 题解了. 下一步可能更新 NLP 相关算法了,非常感谢大家每天的支持. 题目链接 LeetCod ...
- 每日算法刷题Day7-比较字符串大小,去掉多余的空格,单词替换
⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法.
- 每日算法(四十三)-java为了更改的规划城市,需要统计楼栋数目信息。
每日算法(四十三)-java为了更改的规划城市,需要统计楼栋数目信息. 为了更改的规划城市,需要统计楼栋数目信息. 方法如下,一张航拍照片会被分隔为N*M个小格子,每个格子可以用0跟1来表示.如果楼栋 ...
- < 每日算法 - Javascript解析:经典弹珠游戏 >
每日算法 - JavaScript解析:弹珠游戏 一.任务描述: > 示例一: >示例二 二.题意解析 三.解决方案: 往期内容
最新文章
- 程序员面试题精选100题(61)-数对之差的最大值
- sata修改为ahci后系统无法启动_固态重装系统
- 势头迅猛的儿童手表:恐陷下一个文曲星之地?
- 数据竞赛入门-金融风控(贷款违约预测)四、建模与调参
- abstract的子类的错误表达JAVA_如果子类没有覆盖Java中的抽象方法,会发生什么?...
- 11 款最好 CSS 框架 让你的网站独领风骚
- CSS代码重构与优化之路(转)
- jsp内置对象销毁session
- 《工作五年,决定你一生的财富》读后感
- Eclipse打开资源管理器
- lambda分组集合中list和set区别
- 原生js实现对未来dom的事件绑定
- Python第二次作业——判断句
- 文件已经删除,但是空间没有释放的异常
- 如何查看linux内核版本
- 基于 WEB 的实时事件通知方式 服务器推送
- Ubuntu 14.10 安装 hadoop-2.6.0单机配置和伪分布式配置
- linux 无权限挂载 iso,linux无需root挂载iso镜像文件
- 分布式图数据库JanusGraph-简介
- 应届毕业生Android面试经验小谈