【小f的刷题笔记】(JS)数组 - 差分数组 LeetCode1109 & LeetCode1094

【数组】

差分数组:

🌟 频繁对原始数组的某个区间的元素进⾏增减

把每个数与前一个数的差值计算出来存在一个新数组里,区间的加减通过把新数组中区间开始下标的值加/减,区间结束下标对应的值减/加(反一下,因为最后每个数都是通过前一个值得出的)


LeetCode1109

链接:

1109.航班预订统计

题目:

在这里插入图片描述

思路:

-> 就是先定义一个差值数组,所有加的操作先在差值数组中进行,再利用这个差值数组通过第一项,继续推出后面的所有数

在这里插入图片描述

代码:
/**
 * @param {number[][]} bookings
 * @param {number} n
 * @return {number[]}
 */
var corpFlightBookings = function(bookings, n) {
    // 现将nums数组全部赋初值为0
    const nums = new Array(n).fill(0);
    // for-of 数组遍历元素, for-in对象遍历属性
    for(const booking of bookings) {
        nums[booking[0]-1] += booking[2];
        // 后面的值不是最后一个数,就得减
        if(booking[1]<n) {
            nums[booking[1]] -= booking[2];
        }
    }
    for(let i=1; i<n; i++) {
        nums[i] += nums[i-1];
    }
    return nums;
};

LeetCode1094

链接:

1094.拼车

题目:

在这里插入图片描述

思路:

先定义一个差值数组,所有加减操作先在差值数组中进行,再利用这个差值数组通过第一项,继续推出后面的所有数,只要所有元素都比capacity小就行

注意点:

1️⃣ const

​ const声明的变量,不可以修改

​ const声明的数组,数组的元素是可以修改的

​ const声明的对象,对象的属性也是可以修改的

2️⃣ 新建数组

const 数组名 = new Array(数组长度).fill(初值);

3️⃣ [].every(条件)

​ 返回的是boolean

代码:
/**
 * @param {number[][]} trips
 * @param {number} capacity
 * @return {boolean}
 */
var carPooling = function(trips, capacity) {
    // 构建差值数组
    const diff = new Array(1001).fill(0)
    for(const trip of trips) {
        diff[trip[1]] += trip[0]
        diff[trip[2]] -= trip[0] // 这里第三个数是已经放下乘客的位置了,所以直接用下标,不用+1
    }

    // 这里的另一种写法 已知trips数组元素的格式了,就可以直接定义这样的数组,拿数据稍微方便点儿
    // 解构
    // for(const [n, s, e] of trips) {
    //     diff[s] += n
    //     diff[e] -= n
    // }

    let sum = 0
    // 遍历一遍差值数组,算出每个站的乘客数,与capacity比较
    for(let i=0; i<diff.length; i++) {
        sum += diff[i]
        if(sum > capacity) return false
    }
    return true
};

写在最后:
labuladong写得真的好好呀
思路写得比较口语化,之后慢慢改进
还在摸索阶段,加油叭!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值