【3.6】贪心算法-解救生艇问题

一、题目

第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit 。 返回载到每一个人所需的最小船数。(保证每个人都能被船载)。

二、解题思路

题目要求每艘船最多能载两人,为了使船的使用数量最少,我们应尽可能地让每艘船载两人。解决这个问题的策略是首先对数组进行排序,然后优先考虑体重最重的个体。

具体步骤如下:
1. **排序**: 将数组中的体重按从小到大的顺序排列。
2. **配对**: 从体重最重的个体开始,检查其是否能与体重最轻的个体同乘一船。如果能,则让他们同乘;如果不能,则体重最重的个体只能单独乘船。
**3. **迭代**:**继续上述过程,依次考虑体重次重的个体,直到所有人都被分配到船上。

通过这种策略,我们可以最大限度地利用每艘船的载人能力,从而减少船的总使用数量。

三、代码实现

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>

int numRescueBoats(std::vector<int>& people, int limit) {
    // 先对数组进行排序(人发重量按照从小到大的顺序排序)
    std::sort(people.begin(), people.end());
    // 统计船的个数
    int count = 0;
    // 从小到大排序,左边的是最小的,右边的是最大的
    int left = 0;
    int right = people.size() - 1;
    while (left <= right) {
        // 如果体重最大的和体重最小的可以单独乘坐
        // 一条船,就让他们同乘一条船
        if (people[right] + people[left] <= limit)
            left++;
        // 体重最大的每次都要减1
        right--;
        // 使用船的数量
        count++;
    }
    return count;
}

int main() {
    std::vector<int> people = {3, 2, 2, 1};
    int limit = 3;
    int result = numRescueBoats(people, limit);
    std::cout << "Number of boats needed: " << result << std::endl;
    return 0;
}

时间复杂度

  1. 排序 :使用std::sort函数对数组进行排序。在C++中,std::sort通常使用的是快速排序(QuickSort)、堆排序(HeapSort)或插入排序(InsertionSort)的混合算法,其平均时间复杂度为 O(nlog⁡n),其中 n 是数组的长度。

  2. 双指针遍历:使用双指针从两端向中间遍历数组。这个过程的时间复杂度是 O(n),因为每个元素最多被访问一次。

综合起来,整个算法的时间复杂度是 O(nlog⁡n),主要由排序部分决定。

空间复杂度

  1. 排序std::sort的空间复杂度取决于其实现方式。通常情况下,快速排序的空间复杂度是 O(log⁡n),而堆排序的空间复杂度是 O(1)。C++标准库中的std::sort通常会使用一些额外的空间,但不会超过 O(log⁡n)。

  2. 双指针遍历:双指针遍历本身不需要额外的空间,空间复杂度是 O(1)。

综合起来,整个算法的空间复杂度是 O(log⁡n),主要由排序部分决定。

相关推荐
生成论实验室11 分钟前
《事件关系阴阳博弈动力学:识势应势之道》第八篇:认知与反思关系——探索、定位与延续
人工智能·算法·架构·知识图谱·创业创新
十五年专注C++开发18 分钟前
浅谈LLVM
开发语言·c++·qt·clang·llvm
YaraMemo33 分钟前
一文带你区分全局最优解和帕累托最优解
算法·5g·信息与通信·信号处理
白夜111743 分钟前
C++(标签派发 Tag Dispatching)
开发语言·c++·笔记·算法
王老师青少年编程1 小时前
csp信奥赛C++高频考点专项训练之字符串 --【字符串基础】:凯撒密码
c++·字符串·csp·凯撒密码·高频考点·信奥赛·一等奖
YaraMemo1 小时前
数学优化问题中的三大转化:多目标转化为单目标,多变量转化为单变量,有约束转化为无约束
人工智能·算法·5g·信息与通信·信号处理
CSCN新手听安1 小时前
【Qt】Qt窗口(六)QMessageBox消息对话框的使用
开发语言·c++·qt
Ailan_Anjuxi1 小时前
【附Python源码】使用minGPT训练自己的小型GPT语言模型
算法
会编程的土豆1 小时前
由c/c++速通go语言,新手必看
c语言·c++·golang
QuZero1 小时前
StampedLock Mechanism
java·算法