首页 > 其他分享 >1094. 拼车(差分&堆排序)

1094. 拼车(差分&堆排序)

时间:2023-12-11 18:05:57浏览次数:41  
标签:1094 capacity 堆排序 差分 trips 拼车 数组 diff trip


Problem: 1094. 拼车


文章目录

  • 题目
  • 思路
  • Review 差分数组
  • 定义
  • 区间加法减法
  • 更新差分数组:
  • 为啥这样更新
  • 思路1 Code
  • 思路2 Code


题目

车上最初有 capacity 个空座位。车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向)

给定整数 capacity 和一个数组 trips , trip[i] = [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客,接他们和放他们的位置分别是 fromi 和 toi 。这些位置是从汽车的初始位置向东的公里数。

当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false。

示例 1:

输入:trips = [[2,1,5],[3,3,7]], capacity = 4
输出:false

思路

思路1 : 使用堆排序(优先队列维护),每到一个上车或者下车的位置 统计一下当前车上的人数,如果大于了 capacity 就返回 false

思路2 : 使用差分数组 ,对区间 [1094. 拼车(差分&堆排序)_ci ,1094. 拼车(差分&堆排序)_leetcode_02] 同时加1094. 拼车(差分&堆排序)_数组_03。注意在 1094. 拼车(差分&堆排序)_leetcode_02时是立即下车

Review 差分数组

定义

对于一个给定的数组 arr[0…n-1],其差分数组 diff[0…n-1] 定义如下:

1094. 拼车(差分&堆排序)_数组_05
1094. 拼车(差分&堆排序)_数组_06
对于所有 1094. 拼车(差分&堆排序)_ci_07
这意味着 $ diff[i] 1094. 拼车(差分&堆排序)_ci_08

区间加法减法

差分数组的主要用途之一是进行区间加法操作。假设你想对原数组 arr 的子区间 [L, R] 中的所有元素增加一个值 val。使用差分数组,你可以非常高效地完成这个操作:

更新差分数组:

diff[L] += val
如果 R + 1 < n,则 diff[R + 1] -= val.

为啥这样更新

例子 :

1094. 拼车(差分&堆排序)_差分_09

回归到题目 ,我们对 每个 trips的 [1094. 拼车(差分&堆排序)_leetcode_10 ,1094. 拼车(差分&堆排序)_leetcode_11] 同时加Num,统计有没有超过’capacity`。

思路1 Code

class Solution {
public:
    bool carPooling(vector<vector<int>>& trips, int capacity) {
         // 创建一个事件列表
        vector<pair<int, int>> events;
        for (auto& trip : trips) {
            events.push_back({trip[1], trip[0]}); // 上车事件
            events.push_back({trip[2], -trip[0]}); // 下车事件
        }

        // 对事件按地点排序
        sort(events.begin(), events.end());

        int currentPassengers = 0;
        for (auto& event : events) {
            currentPassengers += event.second;
            if (currentPassengers > capacity) {
                return false;
            }
        }
        return true;

    }
};

思路2 Code

class Solution {
public:
    bool carPooling(vector<vector<int>>& trips, int capacity) {
        int maxx = 0 ;
        // 利用差分数组 
        for(auto & trip: trips ) {
            maxx = max(maxx ,trip[2]) ; 
        }
        vector<int> diff(maxx+1) ;
        // 对区间[L,R]同时加 val 
        // 差分数组 diff[L] +val  diff[R+1] -val 
        for(const auto &trip : trips) {
            diff[trip[1]] +=trip[0] ; 
            diff[trip[2]] -=trip[0] ;
        }
        int count = 0 ; 
        for(int i = 0 ; i<=maxx ; ++i) {
            count+=diff[i] ; 
            if(count >capacity) {
                return false ; 
            }
        }
        
        return true ; 
    }
};


标签:1094,capacity,堆排序,差分,trips,拼车,数组,diff,trip
From: https://blog.51cto.com/u_15970235/8776413

相关文章

  • 排序 - 选择排序 & 堆排序
    选择排序简单选择排序算法描述n-1次遍历,每次选出一个未排序区域中的最小元素放入已排序区域中的合适位置。算法实现voidSelectSort(SqList&L){for(i=1;i<L.length;i++){k=i;for(j=i+1;j<=L.length;j++)if(L.r[j].ke......
  • 【教3妹学编程-算法题】拼车
    3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包”2哥 :3妹,什么事呀这么开发。3妹:2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。2哥:是啊,立冬之后天气多以多云为主,好不容易艳阳高照。可是你不能秋游,赶紧收拾收拾上班去啦3妹:哼,好吧~2哥:给你出了一道题......
  • 堆排序
    目录1.基本原理2.例子3.代码实现本文主要介绍堆排序的原理、例子以及代码实现。1.基本原理堆排序(HeapSort)是一种基于比较的排序算法,它的工作原理是首先将待排序的序列构造成一个大顶堆或小顶堆,然后交换堆顶元素和最后一个元素,然后将剩余元素重新调整为大顶堆或小顶堆,再交换堆......
  • Mother bear [UVA10945]
    蒟蒻的首篇题解——Motherbear题目大意:一只笨熊只可以理解回文的句子,要你判断句子去掉标点符号、空格后是否回文。思路:1、利用getline()读入整行字符串,并且处理成只有小写/大写字母和数字的字符串。(样例处理结果对照详见①~②分割线内)2、读取到一半必定会出现倒着的(针对于......
  • 堆排序
    堆是一种特殊的树形数据结构,它满足以下两个性质:完全二叉树:堆是一棵完全二叉树,即除了最底层之外,其他每一层的节点都被完全填满,且最底层的节点都尽可能地集中在左侧。堆属性:对于最大堆(大顶堆)来说,父节点的值总是大于或等于任何一个子节点的值;对于最小堆(小顶堆)来说,父节点的值总是小于或......
  • 堆以及堆的应用--堆排序
    堆定义:什么是堆?从堆的定义上我们可以看出,堆在物理结构上是一维数组,逻辑结构上,可以把堆理解为一棵完全二叉树,因为堆满足ki<=k2i+1,ki<=k2i+2(ki>=k2i+1,ki>=k2i+2),而我们了解对于完全二叉树,父结点和孩子结点存储在一维数组中有如下的下标关系:leftchild=parent*2+1rightchild=parent*2......
  • 在思想方面讨论堆排序(考研自用,按非递减方式排序)
     目录1.什么是排序2.关于堆排序的几个问题3.问题求解首先:排序的定义  拿冒泡排序(递增)来讲,在一个给定的数组序列中,若A[i+1]<A[i],则将其两个的数值进行交换,排好序的序列应该是递增的,类似于[1,2,3,4,5...];所以排序是在数组中进行的,物理......
  • 09-堆排序
    9.堆排序9.1完全二叉树在满二叉树路上的树。如果二叉树是完全二叉树,并且用数组表示,则:位置i的左右孩子节点为2i+1和2i+2位置i的父节点为(i-1)/29.2堆堆是完全二叉树堆有大根小根之分他的每颗子树都必须满足大根/小根堆9.3堆排序1.题目​ 堆排序......
  • 顺风车拼车app软件开发功能介绍
      一、智能匹配路线:  顺风车拼车app软件提供平台智能用户司机匹配功能,用户在平台下单后,输入相关的出发地,目的地,人数,提交系统。平台按照司机和路线进行匹配,用户自主选择沿途的路线,实现灵活的拼车体验。  二、在线支付功能:  方便用户在线支付下单,顺风车,拼车app软......
  • 拼车顺风车app软件开发小程序功能开发
      拼车顺风车已成为当前的出行方式,为了让出行的人享受一个私家车的待遇,我们开发出了一款拼车顺风车软件,可以是app或者小程序,下面看看我们的软件都有那些功能。  一、拼车功能  用户的出行通过发布相关的出行需求,出发地,目的地,出行时间,出行人数。其他的用户看到后按照......