这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战
题目
和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1
。
现在,给你一个整数数组 nums
,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
示例
1 | ini复制代码输入: nums = [1,3,2,2,5,2,3,7] |
1 | ini复制代码输入: nums = [1,2,3,4] |
1 | ini复制代码输入: nums = [1,1,1,1] |
提示
1 <= nums.length <= 2 * 10^4
-10^9 <= nums[i] <= 10^9
解题思路
双指针
题目要求是找到数组的子序列(通过删除一些元素或不删除元素,且不改变其余元素的顺序而得)
,很多人可能会想着那就没办法先排序了,然后就在想还有什么解题但方法。
但其实它这里面有个坑在这,和谐数组的定义是数组中的最大值和最小值直接的距离为1
,那么也就是说,数组中只有相邻的两个数才能构成一个和谐数组,其余元素没得参合进来,那么我们就可以直接进行排序操作了,不是相邻的两个元素都进行删除操作,仅保留所需元素,这样得出的长度与排序前的长度也是一致的,并不会导致结果发生变化。
1 | java复制代码class Solution { |
复杂度分析
- 时间复杂度:O(NlogN)O(NlogN)O(NlogN)
- 空间复杂度:O(1)O(1)O(1)
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!
本文转载自: 掘金