1094. 拼车(差分堆排序)

2023-12-02 19:28
文章标签 堆排序 差分 1094 拼车

本文主要是介绍1094. 拼车(差分堆排序),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 : 使用差分数组 ,对区间 [ f r o m i from_{i} fromi , t o i to_{i} toi] 同时加 n u m i num_{i} numi。注意在 t o i to_{i} toi时是立即下车

Review 差分数组

定义

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

d i f f [ 0 ] = a r r [ 0 ] diff[0] = arr[0] diff[0]=arr[0]
d i f f [ i ] = a r r [ i ] − a r r [ i − 1 ] diff[i] = arr[i] - arr[i-1] diff[i]=arr[i]arr[i1]
对于所有 0 < i < n 0 < i < n 0<i<n
这意味着 $ diff[i] 存储了 存储了 存储了 arr[i]$和 $arr[i-1] $之间的差值 。

区间加法减法

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

更新差分数组:

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

为啥这样更新

例子 :
image.png

回归到题目 ,我们对 每个 trips的 [ f r o m i from_{i} fromi , t o i to_{i} toi] 同时加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. 拼车(差分堆排序)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include

POJ 1364差分约束

给出n个变量,m个约束公式 Sa + Sa+1 + .... + Sa+b < ki or > ki ,叫你判断是否存在着解满足这m组约束公式。 Sa + Sa+1   +   .+ Sa+b =  Sum[a+b] - Sum[a-1]  . 注意加入源点n+1 。 public class Main {public static void main(Strin

Python中差分进化differential_evolution的调用及参数说明

在场景应用中,要求我们的函数计算结果尽可能的逼近实际测量结果,可转化计算结果与测量结果的残差,通过最小化残差,便可求出最优的结果。但使用最小二乘等方法来计算时,常常会使迭代的结果显然局部最优点而导致结算错误。 差分进化原理 差分进化(Differential Evolution,DE)是一种基于群体差异的进化算法,其计算思想主要包括以下几个方面: 一、初始化种群 首先,随机生成一个初始种群

优先队列与堆排序

PriorityQueue 优先级队列中的元素可以按照任意的顺序插入,却总是按照排序的顺序进行检索。无论何时调用remove方法,总会获得当前优先级队列中的最小元素(其实是返回堆顶元素),但并不是对所有元素都排序。它是采用了堆(一个可以自我调整的二叉树),执行增加删除操作后,可以让最小元素移动到根。 堆排序复习 package com.jefflee;import java.util.Arr

6.2排序——选择排序与堆排序

本篇博客梳理选择排序,包括直接选择排序与堆排序 排序全部默认排成升序 一、直接选择排序 1.算法思想 每次遍历都选出最小的和最大的,放到序列最前面/最后面 2.具体操作 (1)单趟 每次遍历都选出最小的和最大的。遍历时,遇到更小的,更新min,遇到更大的,更新max (2)单趟变整体 每趟遍历完之后,begin++,end– 程序结构如下 while(begin<end){//

RS485差分信号不对称

在RS485总线通信中,差分信号不对称的问题时常出现,尤其是在总线未接从机设备的情况下。这一问题不仅影响通信质量,还可能导致信号传输错误。通过对实际波形、芯片手册及电路的深入分析,可以找出引发差分信号不对称的根本原因,并采取相应的解决措施。 问题描述 在RS485通信测试中,当总线上没有从机设备连接时,观察到RS485差分信号(A、B)关于地(GND)不对称。理想情况下,RS485的差分信

堆与堆排序之初见

堆(本文只提二叉堆,当然也有多叉堆)作为一种数据结构,是一个数组,可以被看成是一个近似的完全二叉树,树上的每一个节点对应数组中的一个元素,并且除了最底层节点外,该树是完全充满的,而且是从左向右依次填充。 我们目前经常听到的名词“堆”已经被引申为“垃圾收集存储机制”,但本文提及的“堆”指的是堆数据结构。 为了后续描述方便,我们定义堆的数组为H,用H.length表示堆数组的大小,用H.size表示堆

【POJ】3169 Layout 【HDU】3592 World Exhibition 差分约束

传送门:  【POJ】3169 Layout、【HDU】3592 World Exhibition 题目分析:我会说我只是凭直觉写的吗。。。。。。。 如果有B-A>=C形式的,则建边(B,A,-C)。 如果有B-A<=C形式的,则建边(A,B,C)。 对所有的点X,建边(X,X-1,0)。 最后跑一遍最短路。如果存在负环输出-1,如果点N不可达输出-2,否则输出点N的值(最短路径长