LLは今日とても良い気分です。彼はトランプのデッキを購入し、実際には2人の王と2人の小さな王がいることを発見しました(カードのデッキは元々54でした)...彼はそこからランダムに5枚のカードを引きました幸運なことに、ストレートを描くことができるかどうかを確認し、描くことができる場合は、スポーツ宝くじを購入することにしました。!「ハートエース、スペードの3つ、リトルキング、ビッグキング、スクエアピース5」、「オーマイゴッド!」ストレートではありません... LLは幸せではない、と彼は考え、Big \ LittleKingができると判断しました。は任意の数と見なされ、Aは1、Jは11、Qは12、Kは13と見なされます。上記の5枚のカードは「1、2、3、4、5」(大王と小王はそれぞれ2と4と見なされます)、「とてもラッキー!」に変えることができます。LLはスポーツ宝くじを購入することにしました。ここで、このカードを使用して上記のプロセスをシミュレートし、LLがどれほど幸運であるかを教えてください。カードがストレートを形成できる場合はtrueを出力し、そうでない場合はfalseを出力します。便宜上、サイズキングは0と見なすことができます。
2つの状況を考えてみましょう。
-
numbers
0を含まない場合:
では、どのように判断するのですか?必要性はまっすぐなので、まず第一に不能有重复值
、繰り返される値がない場合、形状はのよう[1 2 3 4 5]
[5 6 7 8 9]
になります最大值与最小值的差值应该小于5
。 -
numbers
0が含まれている場合:0
以降の値を削除した場合の判定方法は1と同じです。
アイデア:最初に並べ替えてから、最後の0の位置を記録します。0は王のサイズを表すため、任意の数として機能し、0を除く最小の数からトラバースできます。同じ数がある場合は、その後、トラバースした場合、0以外に同じ数がないことがわかり、最終的に0以外の最大値と最小値の差が5未満かどうかを判断します。
import java.util.Arrays;
public class Solution {
public boolean isContinuous(int[] numbers) {
int len = numbers.length;
if(len == 0 || numbers == null) return false;
Arrays.sort(numbers);
int i = 0;
for(int j = 0; j < len; j++){
if(numbers[j] == 0) {
i++; // i记录最小值的下标
continue;
}
if(j+1 < len && numbers[j] == numbers[j+1]){
return false;
}
}
return numbers[len-1] - numbers[i] < 5;
}
}
時間計算量:O(NlogN)
空間計算量:O(1)