每日一LeetCode:最长无重复子数组

目录

解题过程:

描述:

分析条件:

解题思路:

滑动窗口算法示例详解(数组:[2,2,3,4,3,5,6])

初始状态

详细步骤

最终结果


解题过程:

描述:

给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。

子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组

数据范围:0≤arr.length≤1050≤arr.length≤105,0<arr[i]≤1050<arr[i]≤105

分析条件:

因为我们要保证子数组是连续的,那么必须利用滑动窗口(双指针实现,左右指针代表的子数组就是滑动窗口),同时要利用HashMap键的唯一性来记录每个元素的长度.
(注意:这道题第一次见比较抽象,参考我给的具体例子看代码)

解题思路:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int maxLength (int[] arr) {
        //1.创建HashMap,用来记录每个元素出现的次数
        HashMap<Integer,Integer> hm = new HashMap<>();
        //2.创建一个int类型的数据记录最大长度
        int res = 0;
        //3.遍历整个arr,left,rigth是滑动窗口的左右边界
        for(int left = 0,right = 0;right < arr.length; right++){
            //right用来扩展代码,将当前right指针对应的数组元素添加到HashMap中
            if(hm.containsKey(arr[right])){
                hm.put(arr[right],hm.get(arr[right]) + 1);
            }else{
                hm.put(arr[right],1);
            }
            //while循环使窗口无重复元素,窗口左移,直到arr[right]减到1
            while(hm.get(arr[right]) > 1){
                hm.put(arr[left],hm.get(arr[left]) - 1);
                left++;
            }
            res = Math.max(res,right - left + 1);
        }
        return res;
    }
}

滑动窗口算法示例详解(数组:[2,2,3,4,3,5,6])

让我们逐步分析输入数组 [2,2,3,4,3,5,6] 的处理过程,这将更清晰地展示滑动窗口算法的工作原理。

初始状态
  • 数组:[2,2,3,4,3,5,6]
  • 窗口:left = 0right = 0
  • 哈希表:mp = {}
  • 结果:res = 0
详细步骤

步骤 1:right = 0,元素 2

  • 窗口:[2]
  • 哈希表:mp = {2:1}
  • 窗口合法(无重复)
  • 更新结果:res = max(0, 0-0+1) = 1

步骤 2:right = 1,元素 2

  • 窗口:[2,2]
  • 哈希表:mp = {2:2}
  • 窗口不合法(元素 2 重复)
  • 移动左指针:left = 1,哈希表更新为 mp = {2:1}
  • 窗口变为:[2],恢复合法
  • 更新结果:res = max(1, 1-1+1) = 1

步骤 3:right = 2,元素 3

  • 窗口:[2,3]
  • 哈希表:mp = {2:1, 3:1}
  • 窗口合法
  • 更新结果:res = max(1, 2-1+1) = 2

步骤 4:right = 3,元素 4

  • 窗口:[2,3,4]
  • 哈希表:mp = {2:1, 3:1, 4:1}
  • 窗口合法
  • 更新结果:res = max(2, 3-1+1) = 3

步骤 5:right = 4,元素 3

  • 窗口:[2,3,4,3]
  • 哈希表:mp = {2:1, 3:2, 4:1}
  • 窗口不合法(元素 3 重复)
  • 移动左指针:left = 2,哈希表更新为 mp = {2:0, 3:1, 4:1}
  • 左指针继续移动:left = 3,哈希表更新为 mp = {3:1, 4:1}
  • 窗口变为:[3,4,3] → [4,3],恢复合法
  • 更新结果:res = max(3, 4-3+1) = 2

步骤 6:right = 5,元素 5

  • 窗口:[4,3,5]
  • 哈希表:mp = {3:1, 4:1, 5:1}
  • 窗口合法
  • 更新结果:res = max(2, 5-3+1) = 3

步骤 7:right = 6,元素 6

  • 窗口:[4,3,5,6]
  • 哈希表:mp = {3:1, 4:1, 5:1, 6:1}
  • 窗口合法
  • 更新结果:res = max(3, 6-3+1) = 4
最终结果
  • 最长无重复子数组长度:4
  • 对应的子数组:[4,3,5,6]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值