题解 | #扑克牌顺子#(附带图解)
扑克牌顺子
http://www.nowcoder.com/practice/762836f4d43d43ca9deb273b3de8e1f4
思路:
从题中给出的有效信息:
- 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的空间
迅雷公司福利 195人发布
