思路:

从题中给出的有效信息:

  • 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的空间