classSolution{publicbooleanisStraight(int[] nums){// O(n) && O(n):哈希表Set<Integer> hashset =newHashSet<>();int max =-1, min =14;for(int num : nums){// 0 不参与比较if(num ==0){continue;}// 重复情况直接 falseif(hashset.contains(num)){returnfalse;}// 维护 max & min & sethashset.add(num);max =Math.max(max, num);min =Math.min(min, num);}// “无重复”,并且 max - min < 5,则一定顺子:用 min & max 固定首尾// a. 1 2 3 4 5// b. 0 0 1 2 5:固定 1 5,由于无重复,其他3个元素在中间刚好填了连续 1 xxx 5// c. 0 0 3 4 5:固定 3 5,同上,不过此处为 xx 3 x 5return max - min <5;}}
二刷
呃,确实忘了最优写法了,但是总体复杂度不变的写法
逐个维护,跑一遍五个数字,没有的用0来替。
classSolution{publicbooleanisStraight(int[] nums){int min =Integer.MAX_VALUE;int counts =0;Set<Integer> set =newHashSet<>();for(int num : nums){if(num ==0){counts++;}else{set.add(num);min =Math.min(num, min);}}for(int i = min; i <= min +4; i++){if(!set.contains(i)){if(counts >0){counts--;}else{returnfalse;}}}returntrue;}}
最优写法:利用了各种条件(见之前的注释)
classSolution{publicbooleanisStraight(int[] nums){int min =14, max =-1;Set<Integer> set =newHashSet<>();for(int num : nums){if(num ==0){continue;}if(set.contains(num)){returnfalse;}else{set.add(num);min =Math.min(min, num);max =Math.max(max, num);}}return max - min <5;}}