算法通关村——滑动窗口高频问题

3.无重复字符的最长子串

function lengthOfLongestSubstring(s: string): number {
  //找重复字符串思路
  /**
   * 利用双指针
   * right用来记录遍历,所有字符
   * //left用处:
   * 当right找到重复的字符时,left要移动到前一个重复元素前,
   * 可以使用map保存,字符的key和索引值
   * right-left+1可以获取当前不重复字符的长度
   * 最后用一个变量保存长度取,最长的那一组即可
   */
  const n = s.length;
  //定义需要用到的变量
  //双指针
  let left = 0;
  const map = new Map<string, number>();

  let maxLength = 0;

  for (let right = 0; right < n; right++) {
    //right变量索引字符
    const rightChar = s[right];

    //每一个保存之前都需要判断,在map中是否存在
    if (map.has(rightChar) && left <= map.get(rightChar)!) {
      //移动到前一个重复字符前
      left = map.get(rightChar)! + 1;
    }

    //使用map保存字符的key,和索引
    map.set(rightChar, right);

    //保存长度
    const currLength = right - left + 1;

    maxLength = Math.max(maxLength, currLength);
  }

  return maxLength;
}

209. 长度最小的子数组

function minSubArrayLen(target: number, nums: number[]): number {

    const n = nums.length

    //利用双指针
    //1.对数组中的值进行求和操作
    //2.当sum >= target时,进行sum-=nums[left++]操作,left往前进行最小长度保存
    //3.接着进行循环判断,最后会找到最小长度

    let left:number = 0;
    let right:number = 0;
    let sum:number = 0;
    let min = Number.MAX_VALUE;
    while(right < n ) {
       //累加操作
       sum +=nums[right++]
       //当sum>=target时进行长度缩减操作
       while(sum >= target ) {
        min = Math.min(min, right - left)
        sum-=nums[left++] 
       }   
    }
     return min === Number.MAX_VALUE ? 0 : min
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值