解题思路:排序 + 遍历
本题给定的描述并不明确,我们抽出的 5 张牌应该是从多副扑克混合后抽取的 5 张牌;所以,可能有多张重复的元素,也有可能出现:[0,0,0,0,0] 这样的情况。
如何判断我们拿到的是“顺子”?
将手中的牌从小到大进行排序
除去大小王外,所有的牌均不重复。
刨去大小王,牌与牌之间的差值和不超过 4 即满足“顺子”的条件。
示例:
[0,0,1,4,5]
对于上述示例,首先,除去大小王,所有的牌不重复;刨去大小王,牌与牌之间的差值和为 (4-1) + (5-4) ≤ 4
所以,我们抽到的这 5 张牌满足“顺子”条件。
代码
class Solution {public boolean isStraight(int[] nums) {Arrays.sort(nums);int i = 0;while(nums[i] == 0){i++;}int count = 0;for(; i < nums.length - 1; i++){if(nums[i] == nums[i + 1]){return false;}count += nums[i + 1] - nums[i];if(count > 4){return false;}}return true;}}
复杂度分析
- 时间复杂度:O(N * logN)
本解法涉及到对数组排序,所以时间复杂度为 O(N * logN)
- 空间复杂度:O(1)
我们只使用了有限的几个变量,所以额外空间占用 O(1)
