备战蓝桥杯————差分数组2

目录

引言

一、拼车        

        题目描述

        解题思路及代码

        结果展示

二、航班预定统计

        题目描述

        解题思路及代码

        结果展示

总结

引言

        在现代交通管理中,拼车服务和航班预订系统是提高资源利用效率、优化用户体验的关键技术。随着城市交通压力的增大和航空业的快速发展,如何有效地处理这些系统的动态变化,成为了算法工程师们面临的挑战。本文将探讨两个典型的算法问题:拼车服务中的车辆容量优化和航班预订统计。我们将通过差分数组这一高效的算法技巧,来解决这些实际问题,展示如何用智慧的算法为现代交通系统注入活力。

一、拼车        

题目描述

        车上最初有 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

示例 2:

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

提示:

  • 1 <= trips.length <= 1000
  • trips[i].length == 3
  • 1 <= numPassengersi <= 100
  • 0 <= fromi < toi <= 1000
  • 1 <= capacity <= 105

解题思路及代码

  这道题我们看到区间及每个区间上的乘客数可以想到使用差分数组,计算每个路段的上车人数,再将计算的数组与容量比较,如果数组的最大值小于容量,返回true,如果不是返回false。

  需要注意的是,在使用下面代码进行比较时,虽然在还原数组时比较少了一个循环,但需要把num[0]也进行比较。

class Solution {
    public int[] diff;
    public int[] res;
    public boolean carPooling(int[][] trips, int capacity) {
        diff=new int[1001];
        for(int[] i:trips ){
            increment(i[1],i[2]-1,i[0]);
        }
        return result(capacity);
    }

    public void increment(int a,int b,int val){
        diff[a]+=val;
        if(b+1<diff.length)diff[b+1]-=val;
    }

    public boolean result(int capacity){
        res=new int[1001];
        res[0]=diff[0];
        for(int i=1;i<diff.length;i++){
            res[i]=res[i-1]+diff[i];
            if(res[i]>capacity)return false;
        }
        if(res[0]>capacity)return false;
        return true;
    }


}

结果展示

二、航班预定统计

题目描述

        这里有 n 个航班,它们分别从 1 到 n 进行编号。有一份航班预订表 bookings ,表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] 意味着在从 firsti 到 lasti (包含 firsti 和 lasti )的 每个航班 上预订了 seatsi 个座位。请你返回一个长度为 n 的数组 answer,里面的元素是每个航班预定的座位总数。

示例 1:

输入:bookings = [[1,2,10],[2,3,20],[2,5,25]], n = 5
输出:[10,55,45,25,25]
解释:
航班编号        1   2   3   4   5
预订记录 1 :   10  10
预订记录 2 :       20  20
预订记录 3 :       25  25  25  25
总座位数:      10  55  45  25  25
因此,answer = [10,55,45,25,25]

示例 2:

输入:bookings = [[1,2,10],[2,2,15]], n = 2
输出:[10,25]
解释:
航班编号        1   2
预订记录 1 :   10  10
预订记录 2 :       15
总座位数:      10  25
因此,answer = [10,25]

提示:

  • 1 <= n <= 2 * 104
  • 1 <= bookings.length <= 2 * 104
  • bookings[i].length == 3
  • 1 <= firsti <= lasti <= n
  • 1 <= seatsi <= 104

解题思路及代码

        其实它就是个差分数组的题,题目翻译一下就是:给你输入一个长度为 n 的数组 nums,其中所有元素都是 0。再给你输入一个 bookings,里面是若干三元组 (i, j, k),每个三元组的含义就是要求你给 nums 数组的闭区间 [i-1,j-1] 中所有元素都加上 k。请你返回最后的 nums 数组是多少?因为题目说的 n 是从 1 开始计数的,而数组索引从 0 开始,所以对于输入的三元组 (i, j, k),数组区间应该对应 [i-1,j-1]

class Solution {
    int diff[];
    int res[];
    int num[];

    public int[] corpFlightBookings(int[][] bookings, int n) {
        num=new int[n];
        diff=new int[n];
        res=new int[n];
        for(int[] i:bookings){
            increment(i[0]-1,i[1]-1,i[2]);
        }
        res[0]=diff[0];
        for(int i=1;i<n;i++){
            res[i]=res[i-1]+diff[i];
        }
        return res;
    }

    public void increment(int i,int j,int val){
        diff[i]+=val;
        if(j+1<diff.length)diff[j+1]-=val;
    }
}

结果展示

总结

        通过本文的分析和实现,我们不仅掌握了差分数组这一强大的算法工具,还学会了如何将其应用于解决实际的交通管理问题。无论是拼车服务中的车辆容量计算,还是航班预订统计,差分数组都以其简洁高效的处理方式,展现了算法的魅力。在技术日益发展的今天,算法不仅是解决问题的手段,更是推动社会进步的重要力量。让我们继续探索算法的深度与广度,用科技的力量为人类的生活带来更多可能。

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小程序○

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值