整数の配列が与えられると、異なる値が1を超えないように、2つ以下の異なる値を含む最長のsubArrayの長さがどのくらいか
例えば:
arr = [0、1、2、1、2、3]->長さ= 4; [1,2,1,2]
arr = [1、2、3、4、5]->長さ= 2; [1,2]
arr = [1、1、1、3、3、2、2]->長さ= 4; [3、3、2、2]
私はそのようなコードを持っています
public static int longestSubarray(List<Integer> arr) {
int max = 0;
Set<Integer> set = new HashSet<>();
int i = 0;
int j = 1;
while (i < arr.size() - 1) {
set.add(arr.get(i));
while (j < arr.size() && Math.abs(arr.get(i) - arr.get(j)) < 2) {
if (!set.contains(arr.get(j))) {
if (set.size() == 2) {
break;
} else {
set.add(arr.get(j));
}
}
++j;
}
max = Math.max(max, j - i);
j = ++i + 1;
set.clear();
}
return max;
}
より良い解決策はありますか?
C#コード:
using System.IO;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> arr = new List<int>(){ 0, 1, 2, 1, 2, 3};
List<int> set = new List<int>();
int n = arr.Count;
int max = 1;
int i,j;
for(i=0 ; i<n-1; i++)
{
set.Add(arr[i]);
for(j=i+1; j<n; )
{
if(Math.Abs(arr[i]-arr[j])<2)
{
if(!set.Contains(arr[j]))
{
if(set.Count == 2)
break;
else
set.Add(arr[j]);
}
}
else
break;
j++;
}
max = Math.Max(max,j-i);
set.Clear();
}
Console.WriteLine(max);
}
}