列表

详情


2294. 划分数组使最大差为 K

给你一个整数数组 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 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int partitionArray(vector<int>& nums, int k) { } };

python3 解法, 执行用时: 156 ms, 内存消耗: 25 MB, 提交时间: 2022-11-26 17:27:54

class Solution:
    def partitionArray(self, nums: List[int], k: int) -> int:
    	nums.sort()
    	ans, _min = 1, nums[0]
    	for num in nums:
    		if num - _min > k:
    			ans += 1
    			_min = num
    	return ans

golang 解法, 执行用时: 168 ms, 内存消耗: 8.4 MB, 提交时间: 2022-11-26 17:26:56

/**
 * 由于选的是子序列,且只需要考虑每个子序列中的最小值和最大值,与子序列中元素的顺序无关,因此我们可以对数组排序。
 * 排序后对数组分组,每组内的元素最大减最小不能超过 k。这可以通过遍历一遍数组来判断,并得到组数。
 */
func partitionArray(nums []int, k int) int {
	sort.Ints(nums)
	ans, min := 1, nums[0]
	for _, num := range nums {
		if num-min > k {
			ans++
			min = num
		}
	}
	return ans
}

上一题