私はHackerRank - Max Differenceでalgoを解決することを実践しました。 D [0]、D [1]、...、D [N-1]:あなたは、n個の要素を持つ配列を指定されている配列の最大差を求める - アルゴリズムの最適化ソリューション
:
ここで与えられた問題です。隣接するすべてのサブアレイの最大差の合計(S)を計算します。正式
:
S = sum{max{d[l,...,r]} - min{d[l, ..., r}},∀ 0 <= l <= r < n
入力形式:
n
d[0] d[1] ... d[n-1]
出力フォーマット:
S
サンプル入力:
4
1 3 2 4
サンプル出力:
12
説明:
l = 0; r = 0;
array: [1]
sum = max([1]) - min([1]) = 0
l = 0; r = 1;
array: [1,3]
sum = max([1,3]) - min([1,3]) = 3 - 1 = 2
l = 0; r = 2;
array: [1,3,2]
sum = max([1,3,2]) - min([1,3,2]) = 3 - 1 = 2
l = 0;r = 3;
array: [1,3,2,4]
sum = max([1,3,2,4]) - min([1,3,2,4]) = 4 - 1 = 3
l = 1; r = 1 will result in zero
l = 1; r = 2;
array: [3,2]
sum = max([3,2]) - min([3,2]) = 3 - 2 = 1;
l = 1; r = 3;
array: [3,2,4]
sum = max ([3,2,4]) - min([3,2,4]) = 4 - 2 = 2;
l = 2; r = 2; will result in zero
l = 2; r = 3;
array:[2,4]
sum = max([2,4]) - min([2,4]) = 4 -2 = 2;
l = 3; r = 3 will result in zero;
Total sum = 12
は、ここに私のソリューションです:
-(NSNumber*)sum:(NSArray*) arr {
int diff = 0;
int curr_sum = diff;
int max_sum = curr_sum;
for(int i=0; i<arr.count; i++)
{
for(int j=i; j<=arr.count; j++) {
// Calculate current diff
if (!(j-i > 1)) {
continue;
}
NSArray *array = [arr subarrayWithRange:NSMakeRange(i, j-i)];
if (!array.count || array.count == 1) {
continue;
}
int xmax = -32000;
int xmin = 32000;
for (NSNumber *num in array) {
int x = num.intValue;
if (x < xmin) xmin = x;
if (x > xmax) xmax = x;
}
diff = xmax-xmin;
// Calculate current sum
if (curr_sum > 0)
curr_sum += diff;
else
curr_sum = diff;
// Update max sum, if needed
if (curr_sum > max_sum)
max_sum = curr_sum;
}
}
return @(max_sum);
}
合計で10件のテストケースがありました。 上記の解決策は最初の5つのテストケースを通過しましたが、タイムアウト(> = 2s)のために失敗したもう1つのテストケースを通過しませんでした。
「状態は次のとおりです:タイムアウトにより終了しました」
このコードをさらに最適化する方法を教えてください。
ありがとうございます!
推測:コードを改善する必要はありません。より良いアルゴリズムが必要です。 – greybeard
助言がありますか? – CoderSaru
「何か提案がありますか? 「n」= 1の場合、解は自明である。 1つの要素を追加するソリューションはどのように変化しますか?完全に(?)異なる角度:maxdiffはすべてのサブアレイで同じですが、minおよび/またはmaxが含まれていない場合は_except_となります。 – greybeard