思路:
从题中给出的有效信息:
- 2副牌
- 5张牌除大小王都是唯一的
故此我们可以采用遍历就可以解决这个问题,需要用到集合等数据结构
方法一:
具体做法:
将 nums 数组依次装入 set集合,遇到 0 则返回装下一个元素,出现重复元素则返回 false,并在其中记录max,min,最终max-min >= 5的都不是顺子;
具体过程如下图所示:
import java.util.*; public class Solution { public boolean IsContinuous(int [] numbers) { Set<Integer> set = new HashSet<>(); int max = Integer.MIN_VALUE, min =Integer.MAX_VALUE; //遍历数组 for (int number: numbers) { if(number == 0) { continue; } //包含相同牌则直接返回,否则加入 if(set.contains(number)){ return false; }else { set.add(number); } //每次遍历记录最大值,最小值 max = StrictMath.max(max,number); min = StrictMath.min(min,number); } return max - min < 5; } }
复杂度分析:
- 时间复杂度:O(nlogn),时间主要花费在遍历数组
- 空间复杂度:O(n),上申请set集合消耗了n的空间
方法二:
具体做法:
我们可以先将数组排序,然后将遍历数组记录大小王数量 ,重复则返回 false ,遍历结束取最大值和最小值进行比较 小于5即是顺子,
import java.util.*; public class Solution { public boolean IsContinuous(int [] numbers) { int king = 0,max,min; //将数组排序 Arrays.sort(numbers); for(int i = 0; i < 4; i++) { //记录王牌个数 if(numbers[i] == 0) king++; else if(numbers[i] == numbers[i + 1]) return false; } max = numbers[4]; min = numbers[king];// king的个数会占去前置位的数组,nums[king]必然是最小值 //最大值和最小值进行比较小于5即是顺子 return numbers[4] - numbers[king] < 5; } }
复杂度分析:
- 时间复杂度:O(nlogn),时间主要花费在sort排序
- 空间复杂度:O(n),上申请set集合消耗了n的空间