你们可能不知道只用 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万是什么概念相关推荐

  1. 每日算法C语言1-求某整数

    每日算法C语言 题目 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析: 在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方如 ...

  2. 【每日算法】C语言8大经典排序算法(2)

    接上文--->[每日算法]C语言8大经典排序算法(1) 二.插入类排序 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中 ...

  3. java回文数算法for_【Java】【每日算法/刷穿 LeetCode】9. 回文数(简单)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]9. 回文数(简单) 宫水三叶发布于 今天 15:30 题目描述 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从 ...

  4. 如何判断数组所有数都不等于一个数_【每日算法Day 91】求解数组中出现次数超过1/3的那个数

    题目链接 LeetCode 229. 求众数 II[1] 题目描述 给定一个大小为 的数组,找出其中所有出现超过 次的元素. 说明: 要求算法的时间复杂度为 ,空间复杂度为 . 示例1 输入: [3, ...

  5. 消除左递归c++代码_【每日算法Day 85】图解算法:一行代码解决约瑟夫环的变体...

    题目链接 LeetCode 390. 消除游戏[1] 题目描述 给定一个从 到 排序的整数列表. 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾. 第二步,在剩下的数字中,从右 ...

  6. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  7. python 旋转矩阵_【每日算法Day 93】不用额外空间,你会旋转一个矩阵吗?

    第 100 天时,我可能会对这 100 天以来的算法题进行一个总结,然后暂时停止更新 LeetCode 题解了. 下一步可能更新 NLP 相关算法了,非常感谢大家每天的支持. 题目链接 LeetCod ...

  8. 每日算法刷题Day7-比较字符串大小,去掉多余的空格,单词替换

    ⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法.

  9. 每日算法(四十三)-java为了更改的规划城市,需要统计楼栋数目信息。

    每日算法(四十三)-java为了更改的规划城市,需要统计楼栋数目信息. 为了更改的规划城市,需要统计楼栋数目信息. 方法如下,一张航拍照片会被分隔为N*M个小格子,每个格子可以用0跟1来表示.如果楼栋 ...

  10. < 每日算法 - Javascript解析:经典弹珠游戏 >

    每日算法 - JavaScript解析:弹珠游戏 一.任务描述: > 示例一: >示例二 二.题意解析 三.解决方案: 往期内容

最新文章

  1. 程序员面试题精选100题(61)-数对之差的最大值
  2. sata修改为ahci后系统无法启动_固态重装系统
  3. 势头迅猛的儿童手表:恐陷下一个文曲星之地?
  4. 数据竞赛入门-金融风控(贷款违约预测)四、建模与调参
  5. abstract的子类的错误表达JAVA_如果子类没有覆盖Java中的抽象方法,会发生什么?...
  6. 11 款最好 CSS 框架 让你的网站独领风骚
  7. CSS代码重构与优化之路(转)
  8. jsp内置对象销毁session
  9. 《工作五年,决定你一生的财富》读后感
  10. Eclipse打开资源管理器
  11. lambda分组集合中list和set区别
  12. 原生js实现对未来dom的事件绑定
  13. Python第二次作业——判断句
  14. 文件已经删除,但是空间没有释放的异常
  15. 如何查看linux内核版本
  16. 基于 WEB 的实时事件通知方式 服务器推送
  17. Ubuntu 14.10 安装 hadoop-2.6.0单机配置和伪分布式配置
  18. linux 无权限挂载 iso,linux无需root挂载iso镜像文件
  19. 分布式图数据库JanusGraph-简介
  20. 应届毕业生Android面试经验小谈

热门文章

  1. VedioCapture
  2. 《经济地理学》读书笔记
  3. [redis] 介绍安装
  4. [No000072]Windows环境变量列表
  5. Windows Store App JavaScript 开发:选取文件和文件夹
  6. VS2010中查询替换使用
  7. FF与IE兼容性总结(转载)
  8. 汇总Eclipse快捷键
  9. 经典英语1000句(转)
  10. Vue.js 源码分析(十七) 指令篇 v-if、v-else-if和v-else 指令详解