ソート後の配列、隣接する要素間の最大の違いを見つけるために、障害の配列を考えます。
配列の要素数が2未満である場合、0が返されます。
例:
入力:[3,6,9,1]
出力:3
説明:ソートされた配列である[1,3,6,9]、前記隣接する要素(3,6)と(6,9)との間に存在する最大の差3です。説明:
すべての配列要素が非負整数、32ビット符号付き整数の範囲内の値であると仮定することができます。
この問題を解決する線形時間複雑さと空間の複雑さの条件で試してみてください。
クラスバケット{ INT分= Integer.MAX_VALUEで、 int型の最大値= はInteger.MIN_VALUE。 } パブリック クラス题164桶排序{ 公共 のint maximumGap(INT [] NUMS){ 場合(NUMS == NULL || nums.length < 2 ){ 戻り 0 。 } INT分= Integer.MAX_VALUEで、 int型の最大値= はInteger.MIN_VALUE。 用(INT {:NUMS I) 分 =Math.min(分、I); 最大 = Math.max(MAX、I); } IF(==最大分){ 戻り 0 ; } // 浴槽区間長=合計長さ/間隔の総数 INT bucketSize数学= .MAX(1、(最大-最小)/(nums.length - 1 )); // タブ間隔数=長さ/バレルの長さ。開閉ゾーン、もう一つのバケットの問題ので バケツ[] =バケット新しい新しいバケット[(最大-最小)/ + bucketSize 1。]; のための(INT I = 0 ; I <nums.length; ++ I){ //浴槽は、一般に、(現在の要素値-最小値)に位置しているとき/バレルの長さ、ここで全体エンドレス自然ダウン整数除算テイクの使用 int型 LOC =(NUMS [I] -最小)/ bucketSize; IF(バケット[ LOC] == NULL ){ バケット[LOC] = 新しい新しいバケット(); } // 浴槽記録のみ最大バケット要素、最小に。各最大最小更新置く バケット[LOC] .min = Math.min(バケット[LOC] .minをNUMS [I]); バケット[LOC] .MAX = Math.max(バケット[LOC] .MAX 、NUMS [I]); } int型 previousMax = Integer.MAX_VALUEで; // 最大記録上のバケツ INT maxGap = はInteger.MIN_VALUEの、 のために(int型私は= 0を。I <buckets.length。++ I){ もし!(バケット[I] = NULL!&& previousMax = Integer.MAX_VALUEの){ maxGap = Math.max(maxGap、バケット[I] .min - previousMax)。 // 桶间间距比较 } もし(!バケット[I] = NULL ){ previousMax = バケット[I] .MAX。 maxGap = Math.max(maxGap、バケット[I] .MAX -バケット[I] .min)。// 桶内间距比较 } } を返すmaxGapを。 } }