【LeetCode】划分数组使最大差为 K Java 题解
题目描述
给你一个整数数组 nums 和一个整数 k 。你可以将 nums 划分成一个或多个 子序列 ,使 nums 中的每个元素都 恰好 出现在一个子序列中。
在满足每个子序列中最大值和最小值之间的差值最多为 k 的前提下,返回需要划分的 最少 子序列数目。
子序列 本质是一个序列,可以通过删除另一个序列中的某些元素(或者不删除)但不改变剩下元素的顺序得到。
复制代码
思路分析
今天的算法题目是求子数组题目,题目将 nums 划分成一个或多个 子序列 ,使 nums 中的每个元素都 恰好 出现在一个子序列中。
这个题目在做的时候,看到是子序列处理题目,容易想到的是顺序的问题,如果有元素顺序的要求,那这个题目就比较困难,思路是枚举所有出现的情况,然后比较求出最少的子序列个数。
仔细分析这个题目,没有对子序列的元素顺序有要求,那我们可以先对整个数组元素排序,数组排序默认是升序。我们定义数组 0 元素为最小元素,然后在区间范围内,判断是否满足题目要求,最大值和最小值的差值小于 k。实现代码如下,供参考。
通过代码
复制代码
总结
上述算法的时间复杂度是 O(n log n),空间复杂度是 O(n)
坚持算法每日一题,加油!
版权声明: 本文为 InfoQ 作者【HQ数字卡】的原创文章。
原文链接:【http://xie.infoq.cn/article/b8dc800c289456d602167d851】。文章转载请联系作者。
评论