[题解]剑指 Offer 61. 扑克牌中的顺子(C++)
题目
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
示例 1:
输入: [1,2,3,4,5]
输出: True
示例 2:
输入: [0,0,1,2,5]
输出: True
限制:
数组长度为 5
数组的数取值为 [0, 13] .
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bu-ke-pai-zhong-de-shun-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
要凑成顺子,就是说5张牌不能重复而且刚好是连续的5张,另外大小王可以看作任意数字。首先对数组进行排序,然后遍历数组,如果有重复数字(nums[i] == nums[i - 1], i > 0)直接返回false;记大小王数量king,将其与其他牌之间的空隙值gap进行比较,如果能够填充就返回true,否则返回false。
时间复杂度O(n*log(n)),空间复杂度O(log(n))。
代码
class Solution {
public:
bool isStraight(vector<int>& nums) {
sort(nums.begin(), nums.end());
int king = 0;
int gap = 0;
for(int i = 0; i < nums.size(); ++i)
{
if(nums[i] == 0) ++king;
if(i > 0 && nums[i] != 0 && nums[i] == nums[i - 1]) return false;
if(i > 0 && nums[i - 1] != 0 && nums[i] > nums[i - 1] + 1)
{
gap += nums[i] - nums[i - 1] - 1;
}
}
return king >= gap;
}
};
思路2
比较gap其实可以从另一个角度出发,只要没有重复且非大小王的牌中最大的牌max和最小的牌min满足max - min < 5,就能凑成对子。
代码
class Solution {
public:
bool isStraight(vector<int>& nums) {
sort(nums.begin(), nums.end());
int king = 0;
for(int i = 0; i < nums.size(); ++i)
{
if(nums[i] == 0) ++king;
else if(i > 0 && nums[i] != 0 && nums[i] == nums[i - 1]) return false;
}
return nums[4] - nums[king] < 5;
}
};
分类:
LeetCode题解
标签:
LeetCode
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!