扑克牌顺子
扑克牌顺子
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]--; } } } }