力扣594:最和谐子序列
力扣594:最和谐子序列
- 题目
- 思路
- 代码
题目
和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
给你一个整数数组 nums ,请你在所有可能的 子序列 中找到最长的和谐子序列的长度。
数组的 子序列 是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
思路
题目是需要我们找到一个符合最大值减最小值为1的子序列,大家要注意子序列的概念,子序列是不需要满足连续性的也不同于子数组我们不能对数组的顺序进行改变。所以我们可以对数组进行操作那么题目又说了是最大值和最小值,想更加方便的得到最大值和最小值以及好确定子序列我们就需要对数组进行排序。
在排序完成后,我们使用双指针来当作子序列的左右边界,接下来因为数组已经是升序的了我们只需要一边移动右边界一边判断右边界位置的值减去左边界位置的值和1的关系即可,如果大于1我们就需要移动左边界如果等于1我们就等于得到了一个符合条件的子序列。除此之外我们再定义一个整型res用来记录子序列的最大值即可,也就是每次得到符合条件的子序列都判断一次是res大还是子序列的长度大。
我们用到了双指针所以这又是一道基础的经典的滑动窗口的题目。
代码
class Solution {
public:int findLHS(vector<int>& nums) {sort(nums.begin(), nums.end());int end = 0;int begin = 0;int res = 0;while (end < nums.size()) {while (nums[end] - nums[begin] > 1) {begin++;}if (nums[end] - nums[begin] == 1) {res = max(res, end - begin + 1);}end++;}return res;}
};