私はHackerRankコードテストを受けるように頼まれ、私に求められたエクササイズはMax Common Array Sliceです。問題は次のようになります。Max Common Array Sliceのアルゴリズムを改善するには?
n個の整数a0、a1 ,. 。 。 、an-1および タスクは、2つの異なる数よりも多くの文字が含まれていない配列の最大スライスを見つけることです。
入力1:
[1、1、1、2、2、2、1、1、2、2、6、2、1、8]
結果1:回答10なぜなら(0,9)の配列スライスは2つ以上の異なる数を持つ配列の最大スライスである であるからです。
- このスライスには、「1,1,1,2,2,2,1,2,2」という10の項目があります。このスライスの
- 2つの異なる番号が1であり、2
入力2:
[53、800、0、0、0、356、8988、1、1]
結果2:(1,4)のスライスが2つ以下の異なる数を持つ配列の最大スライス であるため、答えは4です。スライス(2、5) も有効だろうと、まだ「800,0,0,0」です。このスライス内の4つの項目があります。4.
- の結果を与えるだろう。このスライスの
- 2つの異なる番号がJavaでない以上 二つの異なる数の実装が含まれている配列の最大共通配列スライスはコンマSTDINから数値の 配列を区切らとる
800及び0です。出力はコンソールに書き戻されます。
実装方法は以下のとおりですが、HRでは3つのテストケースがタイムアウトします。明らかにHRはテストケースを隠すので、タイムアウトが発生した条件やタイムアウトの長ささえ正確に把握できませんでした。 私の解決策の漸近的な複雑さを考えると、私はタイムアウトに驚くことはありません。しかし私の質問は、どのように私の解決策を改善することができますか?
事前にお手数をおかけしていただきありがとうございます。
import java.io.*;
import java.lang.*;
import java.util.*;
import java.util.stream.*;
public class Solution {
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
List<Integer> inputSequence = parseIntegerSequence(line);
int largestSliceSize = calculateLargestSlice(inputSequence);
System.out.println(largestSliceSize);
}
private static List<Integer> parseIntegerSequence(String input) {
if (input == null)
return new ArrayList();
return Arrays.asList(input.split("\\s*,\\s*"))
.stream()
.filter(item -> item.matches("^\\s*-?[0-9]+\\s*$"))
.map(item -> Integer.parseInt(item))
.collect(Collectors.toList());
}
private static int calculateLargestSlice(List<Integer> inputSequence) {
Map<Integer, Integer> temporaryMap = new HashMap<>();
int result = 0;
int startIndex = 0;
int uniqueItemCount = 0;
Integer[] array = inputSequence.toArray(new Integer[inputSequence.size()]);
while (startIndex < array.length) { // loop over the entire input sequence
temporaryMap.put(array[startIndex], startIndex);
uniqueItemCount++;
for (int j = startIndex + 1; j < array.length; j++) {
if (temporaryMap.get(array[j]) == null) {
if (uniqueItemCount != 2) {
temporaryMap.put(array[j], j);
uniqueItemCount++;
if (j == array.length - 1) {
result = Math.max(result, j - startIndex + 1);
startIndex = array.length;
break;
}
} else {
result = Math.max(result, j - startIndex);
int item = array[j-1];
int firstFoundIndex = 0;
for(int k=j-1; k>=0; k--)
{
if(array[k] != item)
{
firstFoundIndex = k+1;
break;
}
}
startIndex = firstFoundIndex;
temporaryMap.clear();
uniqueItemCount = 0;
break;
}
} else if (temporaryMap.get(array[j]) != null) {
if (j == array.length - 1) {
result = Math.max(result, j - startIndex + 1);
startIndex = array.length;
break;
}
}
}
}
return result;
}
}
アルゴリズムを簡単な擬似コード言語で説明してください。 –
この質問はhttp://codereview.stackexchange.com/ –
の2つのポインタテクニックO(n) 'probem – Yerken