package array;

import java.util.HashSet;
import java.util.Set;

/**

  • @description: 无重复数字的最长子数组 滑动窗口

  • @author: zhangxianglong

  • @date: 2021/6/17

  • @time: 19:22

  • Copyright (C) 2018 Meituan

  • All rights reserved

  • /
    public class UNMaximalSubArray {

    public static void main(String[] args) {

      int[] arr = new int[]{1, 1, 3, 4, 2};
      int maxLength = maxLength(arr);
    
      System.out.println(maxLength(arr));

    }

    /* 滑动窗口,用set维护一个不重复的窗口 */
    public static int maxLength(int[] arr) {

      int res = 0;
      Set<Integer> set = new HashSet<Integer>();
    
      for (int l = 0, r = 0; r < arr.length; r++) {
          int a = arr[r];
          while (set.contains(a)) {
              set.remove(arr[l++]);
          }
          set.add(a);
          res = Math.max(res, r - l + 1);
      }
      return res;

    }

    /**

    • 通过滑动窗口 这种方式8/10个case能通过

    • @param nums

    • @return

    • /
      public static int maxLength2(int[] nums) {

      int left = 0;
      int right = 0;
      int max = Integer.MIN_VALUE;

      while (right < nums.length) {

        for (int i = left; i < right; i++) {
            if (nums[i] == nums[right]) {
                left++;
            }
        }
        max = Math.max(max, right - left + 1);
        right++;

      }
      return max;
      }

}