扑克牌顺子
扑克牌顺子
http://www.nowcoder.com/questionTerminal/762836f4d43d43ca9deb273b3de8e1f4
剑指offer解法:
1. 排序:O(n)复杂度 2. 计算0的个数 3. 排序后数组中相邻数字之间的空缺总数,numBlank, if (numBlank <= numZero) true else false 4. 判断相邻两个数是否相等(除了0),相等是对子,不可能是顺子,
public class Solution {
public boolean isContinuous(int[] numbers) {
if (numbers == null || numbers.length < 1) {
return false;
}
qsort(numbers);
int len = numbers.length;
int numZero = 0;
int numBlank = 0;
for (int i = 0; i < len; i++) {
if (numbers[i] == 0) {
numZero++;
}
}
int small = numZero;
int big = small + 1;
while (big < len) {
if (numbers[small] == numbers[big]) {
return false;
}
numBlank += numbers[big] - numbers[small] - 1;
small = big;
big++;
}
return numBlank > numZero ? false : true;
}
/**
* 使用哈希表实现 todo : O(n)的排序,常量空间复杂度
* @param numbers
*/
private void qsort(int[] numbers) {
int[] map = new int[14];
for (int i = 0; i < numbers.length; i++) {
map[numbers[i]]++;
}
int j = 0;
for (int i = 0; i < 14; i++) {
while (map[i] > 0) {
numbers[j++] = i;
map[i]--;
}
}
}
} 