【剑指Offer-61】扑克牌中的顺子
问题
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
示例
输入: [1,2,3,4,5]
输出: True
解答1:找充要条件
class Solution {
public:
bool isStraight(vector<int>& nums) {
set<int> s;
for (int i : nums) {
if (s.find(i) != s.end()) return 0; // 有重复就不行
if (i) s.insert(i);
}
return *s.rbegin() - *s.begin() < 5; // set的最右子节点是最大值,左是最小值
}
};
重点思路
如果能得到以下结论那这道题迎刃而解:是不是顺子的充要条件是除了0以外没有重复,并且除了0以外最大最小值之差小于5。
解答2:用0填坑
class Solution {
public:
bool isStraight(vector<int>& nums) {
sort(nums.begin(), nums.end());
int cnt = 0, i = 0;
while (nums[i] == 0) {
i++;
cnt++;
} // 找0的个数
for (; i < nums.size() - 1; i++) {
if (nums[i + 1] == nums[i]) return 0; // 重复则不行
cnt -= nums[i + 1] - nums[i] - 1;
if (cnt < 0) return 0; // 不够填坑也不行
}
return 1;
}
};