找出具有不同整数的最长子数组

4
写一个方法,该方法接受一个整数数组,并返回其具有不同整数的最长子数组的长度。
例如,对于`[1,2,3,4,2,3]`,它应该返回`4`。

1
有趣的问题。 - Jayesh
7个回答

5

我使用了一个HashSet来跟踪从索引i到索引j的所有元素,并在遍历列表时保持计数器。线性时间和空间:

public static int longestSubarray(int[] arr) {
    
    int i = 0, j = 1, max = 0, currLength = 1;
    max = Math.max(max, currLength);
    HashSet<Integer> set = new HashSet<Integer>();
    set.add(arr[0]);
    
    while (i < arr.length - 1 && j < arr.length) {
        if (!set.contains(arr[j])) {
            currLength++;
            set.add(arr[j++]);
        }
        else {
            set.remove(arr[i++]);
            currLength--;
        }
    }
    
    return Math.max(currLength, max);
}

似乎对于 [1,2,3,2,3],它给出了错误的结果 2,而不是 3。 或者我漏掉了什么。 - YevgenyL

0
public int[] getLargestSubArray(int[] array) {
    int length = array.length;
    Set<Integer> set = new HashSet<>();
    int longest = 0;
    int start = 0;

    int longestCurrent = 0;
    int startCurrent = 0;

    int j = 0;
    while (j < length) {
        if (!set.contains(array[j])) {
            set.add(array[j]);
            longestCurrent++;

            if (longestCurrent > longest) {
                longest = longestCurrent;
                start = startCurrent;
            }
            j++;
        } else {
            while (startCurrent < j) {
                longestCurrent--;
                if (array[startCurrent++] == (array[j])) {
                    break;
                }
            }
            set.remove(array[j]);
        }
    }
    int[] longestSubSequence = new int[longest];
    System.arraycopy(array, start, longestSubSequence, 0, longest);
    return longestSubSequence;
}

0
import java.util.*; 
class GFG{ 
static int largest_subarray(int a[], int n) 
{ 
HashSet<Integer> set = new HashSet<Integer>(); 
int ans = 0; 
int counter = 0;
for(int i = 0; i < n; i++) 
{ 
  if(set.contains(a[i])){
     set.clear();
     counter =0;
     }
     set.add(a[i]);
     counter++;
     ans = Math.max(ans, counter);
     
   } 
// Return final ans 
return ans; 
} 

// Driver Code 
public static void main(String[] args) 
{ 
int arr[] = { 1, 2, 4, 4, 5, 6, 7, 8, 3, 4, 5, 3, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4 
}; 
int n = arr.length; 
System.out.print(largest_subarray(arr, n)); 
} 
} 

0
public static int sizeOfLongestDistinctSubArrayO1(int[] arr) {
    int max = 0;
    Map<Integer, Integer> counts = new HashMap<>();
    int cur = 0;
    int prev = 0;
    for (int i = 0, len = arr.length; i < len; i++) {
        if (counts.containsKey(arr[i])) {
            int j = counts.get(arr[i]);
            max = Math.max(max, cur);
            prev = Math.max(j, prev);
            cur = i - prev;
            counts.put(arr[i], i);
        } else {
            cur++;
            counts.put(arr[i], i);
        }
    }
    return Math.max(max, cur);
}

0
public int lengthOfLongestSubarray(int[] arr) {
        
    int max = 0; // Maximum length of subarray with unique elements
    Map<Integer,Integer> map = new HashMap<>();
    // let longest subarray starts at i and ends at j
    for(int i = -1,j = 0; j < arr.length;j++) {
        if(map.containsKey(arr[j])) {
            i = Math.max(i,map.get(arr[j]));
        }
        max = Math.max(max,j-i);
        map.put(arr[j],j);
    }
    return max;
}

0

C# 版本

核心逻辑:

private static int Solve(string s) {
    var dict = new Dictionary < string,int > ();
    var arr = s.Split(" ", StringSplitOptions.RemoveEmptyEntries);
    var start = 0;
    var substrLen = 0;
    for (var i = 0; i < arr.Length; i++) {
        if (dict.ContainsKey(arr[i])) {
            substrLen = substrLen < i - start ? i - start: substrLen;
            var tempStart = dict[arr[i]] + 1;
            for (var j = dict[arr[i]]; j > start; j--) {
                dict.Remove(arr[i]);
            }

            start = tempStart;
            dict[arr[i]] = i;
        }
        else {
            dict.Add(arr[i], i);
        }
    }

    return dict.Count;
}

完整代码在这里


0

Python 版本

#!/usr/bin/env python3

input = [1,2,3,4,2,3,4,5,6,7,3,4]
tmp_list = []
max = 0

for i in input:
    if i not in tmp_list:
        tmp_list.append(i)
    else:
        max = len(tmp_list) if len(tmp_list) > max else max
        tmp_list = [i]

print (max if max >= len(tmp_list) else len(tmp_list))

抱歉,我没有注意到 Java 标签 :(,但是算法已经传达了。 - Sam Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接