写点什么

【LeetCode】划分数组使最大差为 K Java 题解

作者:HQ数字卡
  • 2022 年 6 月 06 日
  • 本文字数:1184 字

    阅读完需:约 4 分钟

题目描述

给你一个整数数组 nums 和一个整数 k 。你可以将 nums 划分成一个或多个 子序列 ,使 nums 中的每个元素都 恰好 出现在一个子序列中。


在满足每个子序列中最大值和最小值之间的差值最多为 k 的前提下,返回需要划分的 最少 子序列数目。


子序列 本质是一个序列,可以通过删除另一个序列中的某些元素(或者不删除)但不改变剩下元素的顺序得到。



示例 1:
输入:nums = [3,6,1,2,5], k = 2输出:2解释:可以将 nums 划分为两个子序列 [3,1,2] 和 [6,5] 。第一个子序列中最大值和最小值的差值是 3 - 1 = 2 。第二个子序列中最大值和最小值的差值是 6 - 5 = 1 。由于创建了两个子序列,返回 2 。可以证明需要划分的最少子序列数目就是 2 。
示例 2:
输入:nums = [1,2,3], k = 1输出:2解释:可以将 nums 划分为两个子序列 [1,2] 和 [3] 。第一个子序列中最大值和最小值的差值是 2 - 1 = 1 。第二个子序列中最大值和最小值的差值是 3 - 3 = 0 。由于创建了两个子序列,返回 2 。注意,另一种最优解法是将 nums 划分成子序列 [1] 和 [2,3] 。
示例 3:
输入:nums = [2,2,4,5], k = 0输出:3解释:可以将 nums 划分为三个子序列 [2,2]、[4] 和 [5] 。第一个子序列中最大值和最小值的差值是 2 - 2 = 0 。第二个子序列中最大值和最小值的差值是 4 - 4 = 0 。第三个子序列中最大值和最小值的差值是 5 - 5 = 0 。由于创建了三个子序列,返回 3 。可以证明需要划分的最少子序列数目就是 3 。
来源:力扣(LeetCode)链接:https://leetcode.cn/problems/partition-array-such-that-maximum-difference-is-k著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码

思路分析

  • 今天的算法题目是求子数组题目,题目将 nums 划分成一个或多个 子序列 ,使 nums 中的每个元素都 恰好 出现在一个子序列中。

  • 这个题目在做的时候,看到是子序列处理题目,容易想到的是顺序的问题,如果有元素顺序的要求,那这个题目就比较困难,思路是枚举所有出现的情况,然后比较求出最少的子序列个数。

  • 仔细分析这个题目,没有对子序列的元素顺序有要求,那我们可以先对整个数组元素排序,数组排序默认是升序。我们定义数组 0 元素为最小元素,然后在区间范围内,判断是否满足题目要求,最大值和最小值的差值小于 k。实现代码如下,供参考。

通过代码

class Solution {    public int partitionArray(int[] nums, int k) {        Arrays.sort(nums);        int ans = 1;        int min = nums[0];        int n = nums.length;        for (int i = 1; i < n; i++) {            if (nums[i] - min <= k) {                continue;            }            ans++;            min = nums[i];        }
return ans; }}
复制代码

总结

  • 上述算法的时间复杂度是 O(n log n),空间复杂度是 O(n)

  • 坚持算法每日一题,加油!

发布于: 刚刚阅读数: 4
用户头像

HQ数字卡

关注

还未添加个人签名 2019.09.29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】划分数组使最大差为 K Java题解_LeetCode_HQ数字卡_InfoQ写作社区