【每日算法Day 99】你们可能不知道只用20万赢到578万是什么概念

简介: 爱丽丝有一手(hand)由整数数组给定的牌。现在她想把牌重新排列成组,使得每个组的大小都是 W,且由 W 张连续的牌组成。如果她可以完成分组就返回 true,否则返回 false。

题目链接


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]

image.png

代码


巧用 map(c++)

classSolution {
public:   
boolisNStraightHand(vector<int>&hand, intW) {   
intn=hand.size();    
if (n%W) returnfalse;  
map<int, int>count;  
for (autox : hand) count[x]++;    
while (count.size()) {     
intstart=count.begin()->first;    
for (inti=start; i<start+W; ++i) {    
if (count.find(i) ==count.end()) returnfalse;                if (!--count[i]) count.erase(i);     
            }       
        }   
returntrue; 
    }
};

排序统计(c++)

classSolution {
public:  
boolisNStraightHand(vector<int>&hand, intW) {    
intn=hand.size();   
if (n%W) returnfalse;    
if (W==1) returntrue;    
sort(hand.begin(), hand.end());      
vector<int>vis(n, 0);   
for (inti=0; i<n; ++i) {      
if (vis[i]) continue;    
intcnt=1;        
vis[i] =1;      
for (intj=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) returnfalse;   
        }     
returntrue;  
    }
};

排序统计2,来自于网友zhanzq(c++)

classSolution {
public: 
boolvalid(vector<int>&lst, intW){    
lst.push_back(0);   
intsz=lst.size();     
intpre=0;  
vector<int>deltas(sz, 0);  
for(inti=0; i<sz; i++){   
pre+=deltas[i];  
if(pre<lst[i]){    
intdelta=lst[i] -pre;  
pre=lst[i];     
if(i+W<sz){        
deltas[i+W] -=delta;     
                }      
            }elseif(pre>lst[i]){   
returnfalse;      
            }     
        }    
returntrue; 
    }
boolisNStraightHand(vector<int>&hand, intW) {    
intsz=hand.size();  
if(sz%W){  
returnfalse;      
        }else{     
sort(hand.begin(), hand.end()); 
vector<int>lst;   
inti=0, j=0;     
while(i<sz){     
while(j<sz&&hand[i] ==hand[j]){  
j++;     
                }      
lst.push_back(j-i);       
if(j>=sz){         
break;       
                }elseif(hand[j] !=hand[j-1] +1){   
lst.push_back(0);   
                }         
i=j;     
            }        
returnvalid(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/

image.png

作者简介:godweiyang知乎同名华东师范大学计算机系硕士在读,方向自然语言处理与深度学习喜欢与人分享技术与知识,期待与你的进一步交流~


相关文章
|
5月前
|
机器学习/深度学习 算法 数据可视化
近端策略优化算法PPO的核心概念和PyTorch实现详解
本文深入解析了近端策略优化(PPO)算法的核心原理,并基于PyTorch框架实现了完整的强化学习训练流程。通过Lunar Lander环境展示了算法的全过程,涵盖环境交互、优势函数计算、策略更新等关键模块。内容理论与实践结合,适合希望掌握PPO算法及其实现的读者。
835 2
近端策略优化算法PPO的核心概念和PyTorch实现详解
|
存储 算法
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
这篇文章详细介绍了图的概念、表示方式以及深度优先遍历和广度优先遍历的算法实现。
291 1
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
|
存储 算法 Linux
【数据结构和算法】---二叉树(1)--树概念及结构
【数据结构和算法】---二叉树(1)--树概念及结构
198 0
|
机器学习/深度学习 算法
【机器学习】解释对偶的概念及SVM中的对偶算法?(面试回答)
解释了对偶的概念,指出对偶性在优化问题中的重要性,尤其是在强对偶性成立时可以提供主问题的最优下界,并且详细阐述了支持向量机(SVM)中对偶算法的应用,包括如何将原始的最大间隔优化问题转换为对偶问题来求解。
459 2
|
机器学习/深度学习 人工智能 自然语言处理
机器学习之深度学习算法概念
深度学习算法是一类基于人工神经网络的机器学习方法,其核心思想是通过多层次的非线性变换,从数据中学习表示层次特征,从而实现对复杂模式的建模和学习。深度学习算法在图像识别、语音识别、自然语言处理等领域取得了巨大的成功,成为人工智能领域的重要技术之一。
361 3
|
存储 算法 C语言
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
430 7
|
搜索推荐 算法
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
|
存储 NoSQL 算法
Redis集群,集群的概念 三种主流分片方式1.哈希求余 一致性哈希算法:方案三:哈希槽分区算法问题一Redis集群是最多有16384个分片吗问题二:为什么是16384个,集群扩容:1.新的主节点
Redis集群,集群的概念 三种主流分片方式1.哈希求余 一致性哈希算法:方案三:哈希槽分区算法问题一Redis集群是最多有16384个分片吗问题二:为什么是16384个,集群扩容:1.新的主节点
|
存储 机器学习/深度学习 算法
数据结构与算法⑬(第四章_中_续二)堆解决Topk问题+堆的概念选择题
数据结构与算法⑬(第四章_中_续二)堆解决Topk问题+堆的概念选择题
236 3

热门文章

最新文章