划分数组使最大差为 K

简介: 🎈每天进行一道算法题目练习,今天的题目是“划分数组使最大差为 K”。

说在前面

🎈每天进行一道算法题目练习,今天的题目是“划分数组使最大差为 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 。

提示:

1 <= nums.length <= 10^5
0 <= nums[i] <= 10^5
0 <= k <= 10^5

思路分析

首先我们应该要先理解一下题意,题目会给我们两个参数,一个数组nums和一个整数k,我们需要对这个数组nums进行分割,将其分割成n组,分割后的每一组数据中的最大值和最小值之差不能超过k,我们需要计算出组数n的最小值,也就是要我们计算最少分割成多少组可以得到满足题意的数组。\
知道了题意之后其实就很简单了,我们只需要先将原数组进行排序,然后依次遍历将差值小于等于k的放到一个数组,超过k的则需要另开一个数组来存放,遍历完一遍之后我们就可以得出答案了。

  • 1、数组排序

修改内置sort函数的排序规则即可。

nums = nums.sort((a,b)=>{
    return a - b;
});
  • 2、遍历分组

因为是排过序的数组,所以新开数组时第一个元素即为最小值,我们只需要将遍历的元素和最小值进行比较,判断是否需要另开一数组即可。

let res = 1,p = nums[0];
for(let i = 1; i < nums.length; i++){
    if(nums[i] > p + k) {
        res++;
        p = nums[i];
    }
}

AC代码

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
 var partitionArray = function(nums, k) {
    nums = nums.sort((a,b)=>{
        return a - b;
    });
    let res = 1,p = nums[0];
    for(let i = 1; i < nums.length; i++){
        if(nums[i] > p + k) {
            res++;
            p = nums[i];
        }
    }
    return res;
};

说在后面

🎉这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
|
机器学习/深度学习 算法 Python
LightGBM中的特征选择与重要性评估
LightGBM中的特征选择与重要性评估【2月更文挑战第1天】
2651 0
|
算法 前端开发
根据模式串构造最小数字
根据模式串构造最小数字
99 0
|
数据采集 安全
主动扫描和被动扫描
在扫描器中输入目标域名或者URL用爬虫模块爬取所有链接,对GET、POST等请求进行参数变形和污染,进行重放测试,然后依据返回信息中的状态码、数据大小、数据内容关键字等去判断该请求是否含有相应的漏洞。
1142 0
主动扫描和被动扫描
|
存储 Linux 网络安全
存放位置阿里云服务器代码的
阿里云服务器提供虚拟化计算、存储与网络服务。创建服务器时,可基于不同需求选择代码存放位置:文件系统支持直接通过SSH访问与编辑;公共目录如 `/var/www/html` 适合Web应用;对象存储OSS适用于大数据处理;代码托管服务如 GitLab 则利于版本控制与团队协作。合理选择有助于提升开发效率。
204 7
|
Java Spring
spring多线程实现+合理设置最大线程数和核心线程数
本文介绍了手动设置线程池时的最大线程数和核心线程数配置方法,建议根据CPU核数及程序类型(CPU密集型或IO密集型)来合理设定。对于IO密集型,核心线程数设为CPU核数的两倍;CPU密集型则设为CPU核数加一。此外,还讨论了`maxPoolSize`、`keepAliveTime`、`allowCoreThreadTimeout`和`queueCapacity`等参数的设置策略,以确保线程池高效稳定运行。
2087 11
spring多线程实现+合理设置最大线程数和核心线程数
|
机器学习/深度学习 人工智能 算法框架/工具
什么是CANN和Ascend C
CANN(Compute Architecture for Neural Networks)是华为推出的AI异构计算架构,支持多种AI框架如MindSpore、PyTorch等,适用于AI处理器与编程,旨在提升昇腾AI处理器的计算效率。CANN提供强大的图引擎、算子开发语言Ascend C、算子加速库AOL、集合通信库HCCL、毕昇编译器及Runtime运行时,支持快速构建AI应用,涵盖推理应用开发、模型训练和算子开发等关键功能。
2708. 一个小组的最大实力值
【9月更文挑战第2天】
102 1
|
算法 API C++
蓝桥杯历年真题分类汇总(史上最全版本,一定不要错过)
蓝桥杯历年真题分类汇总(史上最全版本,一定不要错过)
蓝桥杯历年真题分类汇总(史上最全版本,一定不要错过)
|
测试技术 C++
c++优先队列priority_queue(自定义比较函数)
c++优先队列priority_queue(自定义比较函数)
1500 0
【每日一题Day318】LC1123最深叶节点的最近公共祖先 | dfs
【每日一题Day318】LC1123最深叶节点的最近公共祖先 | dfs
81 0