【算法】【C++、贪心、排序】力扣100161. 划分数组并满足最大差限制

原题链接


【贪心、排序】力扣100161. 划分数组并满足最大差限制

贪心算法介绍

贪心算法是一种在每一步选择当前看来最好的方案的算法。它不考虑未来的影响,只考虑当前的局部最优解。贪心算法通常用于解决一些具有子结构最优性质的问题,即问题的最优解可以由其子问题的最优解组合而成。

贪心算法的基本步骤如下:

  1. 初始化:将问题分解成若干个子问题,并初始化一个空解集。
  2. 选择:在当前子问题中,选择一个当前看来最好的方案。
  3. 合并:将选出的方案添加到解集中,并更新子问题。
  4. 重复:重复步骤 2 和 3,直到所有子问题都被解决。

贪心算法的优点是简单易懂,并且在某些情况下可以找到最优解。然而,贪心算法也存在一些缺点,例如:

  • 贪心算法可能会做出局部最优的选择,而错过全局最优解。
  • 贪心算法不适用于所有问题,只有当问题具有子结构最优性质时,贪心算法才能找到最优解。

贪心算法的一些典型应用包括:

  • 活动选择问题:在给定一系列活动及其开始和结束时间的情况下,选择一个最大的不相交活动子集。
  • 最小生成树问题:在给定一个无向图及其边权重的情况下,找到一个权重最小的生成树。
  • 哈夫曼编码:在给定一系列字符及其出现的频率的情况下,构造一个最优的编码方案,使得编码后的字符串长度最短。

贪心算法是一种非常有用的算法,它可以快速地找到问题的近似解。然而,在使用贪心算法时,需要注意其局限性,并考虑问题是否具有子结构最优性质。

题目描述

给定一个长度为 n 的整数数组 nums,以及一个正整数 k。将这个数组划分为一个或多个长度为 3 的子数组,并满足以下条件:

  • nums 中的每个元素都必须恰好存在于某个子数组中。
  • 子数组中任意两个元素的差必须小于或等于 k。

返回一个二维数组,包含所有的子数组。如果不可能满足条件,就返回一个空数组。如果有多个答案,返回任意一个即可。

算法步骤

  1. 排序数组:首先,对数组 nums 进行排序,以便于后续操作。排序后的数组可以让我们更容易地找到满足条件的子数组。
  2. 初始化结果数组:创建一个二维数组 ans,用于存储满足条件的子数组。
  3. 遍历数组:从数组 nums 的开头开始遍历,每次取三个连续的元素组成一个子数组。
  4. 检查子数组是否满足条件:对于每个子数组,检查其是否满足条件,即子数组中任意两个元素的差必须小于或等于 k。
  5. 将满足条件的子数组添加到结果数组:如果子数组满足条件,则将其添加到结果数组 ans 中。
  6. 重复步骤 3-5:继续遍历数组,直到所有元素都被处理完。
  7. 返回结果数组:最后,返回结果数组 ans。
遍历结束
算法步骤
遍历过程的操作
满足条件
不满足条件
返回答案数组
初始化答案数组
排序数组
遍历数组
子数组是否满足条件
构建包含接下来三个数字的子数组
填入答案数组中
舍弃该子数组
是否遍历完毕

代码实现

class Solution {
public:
    vector<vector<int>> divideArray(vector<int>& nums, int k) {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        vector<vector<int>> ans;
        for (int i = 0; i < n;) {
            int cnt = 0;
            vector<int> sub_arr(3);
            while (cnt < 3) {
                sub_arr[cnt] = nums[i];
                i++;
                cnt++;
            }
            if (sub_arr[2] - sub_arr[0] > k) {
                return vector<vector<int>>();
            } else {
                ans.push_back(sub_arr);
            }
        }
        return ans;
    }
};

复杂度分析

  • 时间复杂度:O(n log n),其中 n 是数组 nums 的长度。排序数组的时间复杂度为 O(n log n),遍历数组的时间复杂度为 O(n)。
  • 空间复杂度:O(n),其中 n 是数组 nums 的长度。结果数组 ans 的大小为 O(n)。
  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值