首页 > 其他分享 >【Leetcode 594 】 最长和谐子序列 —— 这是假的滑动窗口吧!

【Leetcode 594 】 最长和谐子序列 —— 这是假的滑动窗口吧!

时间:2024-08-15 11:26:32浏览次数:15  
标签:begin end 594 nums res numsMap 滑动 Leetcode 窗口

和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。

现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。

数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。

示例 1:

输入:nums = [1,3,2,2,5,2,3,7]
输出:5
解释:最长的和谐子序列是 [3,2,2,2,3]

示例 2:

输入:nums = [1,2,3,4]
输出:2

示例 3:

输入:nums = [1,1,1,1]
输出:0

提示:

  • 1 <= nums.length <= 2 * 104
  • -109 <= nums[i] <= 109

哈希表 

//哈希表
function findLHS(nums: number[]): number {
  const numsMap = new Map<number, number>();
  let res = 0;
  //保存每个数出现的次数
  for (const num of nums) {
    const v = (numsMap.get(num) || 0) + 1;
    numsMap.set(num, v);
  }

  numsMap.forEach((_, key) => {
    //有和谐数,则计算和谐数组的长度
    if (numsMap.has(key + 1)) {
      const newRes = numsMap.get(key)! + numsMap.get(key + 1)!;
      res = Math.max(res, newRes);
    }
  });
  return res;
}

滑动窗口

//滑动窗口
function findLHS(nums: number[]): number {
  nums.sort((a, b) => a - b);
  let res = 0;
  let begin = 0;
  for (let end = 0; end < nums.length; end++) {
    //右边界与左边界的值相差大于1,则缩小窗口左侧
    while (nums[end] - nums[begin] > 1) {
      begin++;
    }
    //右边界与左边界的值相差等于1,比较之前窗口和此窗口,保存大窗口的值
    while (nums[end] - nums[begin] === 1) {
      res = Math.max(res, end - begin + 1);
    }
  }
  return res;
}

标签:begin,end,594,nums,res,numsMap,滑动,Leetcode,窗口
From: https://blog.csdn.net/Caoshuang_/article/details/141217852

相关文章

  • LeetCode每日一题----特殊数组二
    解析:1.int[]nums:一个整数数组。2.int[][]queries:一个二维整数数组,每个一维数组包含两个整数,表示查询的范围。该方法的主要功能是根据给定的nums数组和一系列查询queries,判断每个查询区间[queries[i][0],queries[i][1]]内的元素是否都具有相同的奇偶性。返回一个布......
  • 【LeetCode:3148】矩阵中的最大得分(Java)
    题目链接3148.矩阵中的最大得分题目描述给你一个由正整数组成、大小为mxn的矩阵grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格(不必相邻)。从值为c1的单元格移动到值为c2的单元格的得分为c2-c1。你可以从任一单元格开始......
  • 0基础leetcode练习(移动零)
    一、题目介绍这是移动零的网址,大家可以看完博客的思路去练习一下。给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。示例1:输入:nums=[0,1,0,3,12]输出:[1,3,12,0,0]......
  • LeetCode40.组合总和II
    LeetCode40.组合总和II力扣题目链接(opensnewwindow)给定一个数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。......
  • LeetCode39. 组合总和
    LeetCode39.组合总和题目叙述:给定一个无重复元素的数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的数字可以无限制重复被选取。说明:所有数字(包括target)都是正整数。解集不能包含重复的组合。示例1:输入:ca......
  • LeetCode 3 无重复字符的最长子串
    题目描述给定一个字符串s,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为3。示例2:输入:s="bbbbb"输出:1解释:因为无重复字符的最长子串是"b",所以其长度......
  • LeetCode 链表两数相加
    题目描述给你两个 非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0 开头。示例1:输入:l1=[2,4,3],......
  • LeetCode216.组合总和lll
    4.组合总和lll(LeetCode216)题目叙述:找出所有相加之和为n的k个数的组合,且满足下列条件:只使用数字1到9每个数字最多使用一次返回所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。示例1:输入:k=3,n=7输出:[[1,2,4]]解释:1......
  • leetcode面试经典150题- 380. O(1) 时间插入、删除和获取随机元素
     https://leetcode.cn/problems/insert-delete-getrandom-o1/description/?envType=study-plan-v2&envId=top-interview-150gotypeRandomizedSetstruct{isHavemap[int]inttotalintarr[]int}funcConstructor()RandomizedSet{retur......
  • leetcode面试经典150题- 45. 跳跃游戏 II
    https://leetcode.cn/problems/jump-game-ii/description/?envType=study-plan-v2&envId=top-interview-150gopackageleetcode150import"testing"funcTestJump2(t*testing.T){nums:=[]int{5,9,3,2,1,0,2,3,3,1,0,0}res:=j......