881. 救生艇

2024-06-10 15:12
文章标签 881 救生艇

本文主要是介绍881. 救生艇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

给定数组 peoplepeople[i] 表示第 i 个人的体重,船的数量不限,每艘船可以承载的最大重量为 limit

每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit

返回承载所有人所需的最小船数。

示例 1:

  • 输入:people = [1,2], limit = 3
  • 输出:1
  • 解释:1 艘船载 (1, 2)

示例 2:

  • 输入:people = [3,2,2,1], limit = 3
  • 输出:3
  • 解释:3 艘船分别载 (1, 2), (2) 和 (3)

示例 3:

  • 输入:people = [3,5,3,4], limit = 5
  • 输出:4
  • 解释:4 艘船分别载 (3), (3), (4), (5)

提示:

  • 1 <= people.length <= 5 * 10^4
  • 1 <= people[i] <= limit <= 3 * 10^4

代码

完整代码

#include <stdio.h>
#include <stdlib.h>int cmp(const void* a, const void* b)
{return (*(int*)b) - (*(int*)a);
}int numRescueBoats(int* people, int peopleSize, int limit) {int boatNum = 0;int firstManIndex = 0;int secondManIndex = peopleSize - 1;qsort(people, peopleSize, sizeof(int), cmp);for (; firstManIndex <= secondManIndex; firstManIndex++){if(people[firstManIndex] <= limit - people[secondManIndex]) // 能装下头尾两个人{secondManIndex--;}boatNum++;}return boatNum;
}

思路分析

题目的要求是找到能够把所有人运送到目的地所需的最小船数。每艘船最多能载两人,且两人的总重量不能超过 limit。这是一个典型的贪心算法问题。

拆解分析

  1. 排序:首先将所有人的体重进行降序排序。这样可以确保每次尽可能的让较重的人和较轻的人配对,从而减少船的使用数量。
  2. 双指针:使用两个指针 firstManIndexsecondManIndex 分别指向体重数组的头和尾。每次尝试将最重的人和最轻的人配对,如果他们的重量之和不超过 limit,则可以一起上船,移动尾指针;否则,最重的人单独上船。
  3. 计数船数:每次循环中,不论是配对成功还是失败,都需要增加船的数量。

复杂度分析

  • 时间复杂度:排序的时间复杂度为 O(n log n),其中 npeople 数组的长度。双指针遍历数组的时间复杂度为 O(n)。因此,总的时间复杂度为 O(n log n)
  • 空间复杂度:排序的递归栈深度在最坏情况下为 O(n)。双指针方法本身只使用了常数空间,因此总的空间复杂度为 O(n)
    在考虑递归栈的情况下,qsort 的空间复杂度取决于其递归深度。对于最坏情况(即每次选择的基准都导致最不平衡的分割),递归深度可以达到 O(n),其中 n 是数组的长度。然而,典型的实现通常使用一些优化,例如随机选择基准元素或三取样中值选择基准,这可以将平均情况下的递归深度降低到 O(log n)
    所以,qsort 在考虑递归栈的情况下,其空间复杂度如下:
    最坏情况O(n)
    平均情况O(log n)

因此,在我们的分析中,需要考虑最坏情况下的 O(n) 递归栈空间复杂度。

结果

在这里插入图片描述

这篇关于881. 救生艇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1048510

相关文章

leetcode解题思路分析(一百零三)881 - 887 题

救生艇 第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit。每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。返回载到每一个人所需的最小船数。(保证每个人都能被船载)。 贪心算法:双指针滑动,如果最轻+最重可以坐得下,则一起走,否则把最重的人先驮走 class Solution {public:int numRescueBoats(vector

Day 18:881. 救生艇

Leetcode 881. 救生艇 给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船数 。 这里有一个条件,每艘船最多同时载两人,就变简单了。我考虑了载一个最重和最轻的人,然后还可以加一个稍微轻点的的人,这里就

​LeetCode解法汇总881. 救生艇

目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:. - 力扣(LeetCode) 描述: 给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。 每艘船最多可同时

Java数据结构与算法(leetcode热题881. 救生艇)

前言 救生艇属于贪心算法,解题之前条件一定要归纳好。题目中存在3个要求: 1.一艘船最多坐2人 2.船数要求最小 3.每艘船重量小于limit 意味着体重较轻的两人可以同乘一艘救生艇。 . - 力扣(LeetCode) 实现原理 1.重量大的有轻的可以配对,则可以配对同乘。 2.重量大的没有轻的可以配对,则单独乘。 3.涉及到轻重配对,最佳还是优先给予排序好的数据进行配对。

LeetCode 0881.救生艇:排序+双指针(大人掌船,能捎就捎)

【LetMeFly】881.救生艇:排序+双指针(大人掌船,能捎就捎) 力扣题目链接:https://leetcode.cn/problems/boats-to-save-people/ 给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。 返回 承

881救生艇

给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船数 。 分析: 贪心策略:先将people数组从小到大排序,考虑第一个人,如果他和最后一个人不能乘坐同一条船,那么最后一个人只能单独分配一条船。再考虑倒数第二个人,

881. 救生艇 Medium

给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船数 。 示例 1: 输入:people = [1,2], limit = 3输出:1解释:1 艘船载 (1, 2) 示例 2: 输入:people = [3,

救生艇筏 - 发现块状的世界在这个游戏针对iOS

救生艇筏 - 发现块状的世界在这个游戏针对iOS   的Minecraft   球迷现在必须很高兴,因为有一个不同的系列这个游戏​​市场的iOS上。救生艇筏真的是一个游戏,你需要通过简单的手工制作,勘探,施工生存,更以完全相同的宇宙就像我的世界。利用相同的图表,在这里你可以看到你自己的屏幕上这么多块状的细节,你需要你的编程技巧,现在,只要你喜欢游戏里做尽可能多的事情。很多人都喜欢我的世界,如果你看

61 贪心算法解救生艇问题

问题描述:第i个人的体重为peaple[i],每个船可以承载的最大重量为limit。每艘船最多可以同时载两人,但条件是这些人的重量之和最多为limit,返回载到每一个人多虚的最小船数,(保证每个人被船载)。 贪心算法求解:先将数组进行排序,然后使用双指针指向头和尾,如果头尾之和比limit小,则船数加一,双指针移动,如果大于limit,则船数量+1,尾指针前移,使用while循环退出这个过程,判

【LeetCode】881 救生艇 中等题

给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船数 。 示例 1: 输入:people = [1,2], limit = 3输出:1解释:1 艘船载 (1, 2) 示例 2: 输入:people = [