web-dev-qa-db-ja.com

1以下の異なる2つ以下の異なる値を持つ最長のsubArray

整数の配列が与えられると、異なる値が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;
    }

より良い解決策はありますか?

4
Igor Pereverzev
0
VR7

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); 
    }
}
0
Sarvesh Singh