算法专题:差分数组

这篇具有很好参考价值的文章主要介绍了算法专题:差分数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前置知识

构建一个差分数组

void func(int * lb1,int len)
{
    int * lb2=new int [len];
    lb2[0]=lb1[0];
    for (int i=1;i<len;i++)
        lb2[i]=lb1[i]-lb1[i-1];
}

操作一个连续区间

void func(int * lb,int len1,int begin,int len2,int x)
{
    lb[begin]+=x;
    if (begin+len2<len1)
        lb[begin+len2]-=x;
}

练习习题

1094. 拼车

class Solution {
public:
    bool carPooling(vector<vector<int>>& trips, int capacity) {
        int lb[1001] {};
        for (int i=0;i<trips.size();i++)
        {
            lb[trips[i][1]]+=trips[i][0];
            lb[trips[i][2]]-=trips[i][0];
        }
        int count=0;
        for (int i=0;i<1001;i++)
        {
            count+=lb[i];
            if (count>capacity) return false;
        }
        return true;
    }
};

1109. 航班预订统计

class Solution {
public:
    vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) {
        int * lb=new int [n+1];
        for (int i=0;i<n+1;i++) lb[i]=0;
        for (int i=0;i<bookings.size();i++)
        {
            lb[bookings[i][0]-1]+=bookings[i][2];
            lb[bookings[i][1]]-=bookings[i][2];
        }
        vector<int> result(n,0);result[0]=lb[0];
        for (int i=1;i<n;i++)
            result[i]=result[i-1]+lb[i];
        delete [] lb;
        return result;
    }
};

1450. 在既定时间做作业的学生人数

class Solution {
public:
    int busyStudent(vector<int>& startTime, vector<int>& endTime, int queryTime) {
        int time[1000] {};
        for (int i=0;i<startTime.size();i++)
        {
            time[startTime[i]-1]+=1;
            if (endTime[i]<1000) time[endTime[i]]-=1;
        }
        for (int i=1;i<1000;i++)
            time[i]=time[i-1]+time[i];
        return time[queryTime-1];
    }
};

2406. 将区间分为最小组数

class Solution {
public:
    int minGroups(vector<vector<int>>& intervals) {
        //1e6是双精度浮点数
        int lb[int(1e6+1)] {};
        for (int i=0;i<intervals.size();i++)
        {
            lb[intervals[i][0]-1]+=1;
            lb[intervals[i][1]]-=1;
        }
        int result=lb[0],count=lb[0];
        for (int i=1;i<1e6;i++)
        {
            count=count+lb[i];
            if (count>result) result=count;
        }
        return result;
    }
};

2381. 字母移位II

class Solution {
public:
    string shiftingLetters(string s, vector<vector<int>>& shifts) {
        int * lb1=new int [s.size()+1];
        for (int i=0;i<s.size()+1;i++) lb1[i]=0;
        for (int i=0;i<shifts.size();i++)
        {
            int x=shifts[i][2]==1?1:-1;
            lb1[shifts[i][0]]+=x;lb1[shifts[i][1]+1]-=x;
        }
        int * lb2=new int [s.size()];lb2[0]=lb1[0];
        for (int i=1;i<s.size();i++)
            lb2[i]=lb2[i-1]+lb1[i];
        string result;
        for (int i=0;i<s.size();i++)
        {
            int x=lb2[i];x+=26*1e5;x%=26;
            if (s[i]+x<='z') result+=char(s[i]+x);
            else result+=char(s[i]+x-26);
        }
        delete [] lb1;delete [] lb2;
        return result;
    }
};

2772. 使数组中的所有元素都等于零

class Solution {
public:
    bool checkArray(vector<int> &nums, int k) {
        int * lb=new int [nums.size()];
        for (int i=0;i<nums.size();i++) lb[i]=0;
        lb[0]=nums[0];
        for (int i=1;i<nums.size();i++)
            lb[i]=nums[i]-nums[i-1];
        for (int i=0;i<nums.size()-k;i++)
        {
            if (lb[i]<0) return false;
            lb[i+k]+=lb[i];
        }
        for (int i=nums.size()-k+1;i<nums.size();i++)
            if (lb[i]!=0) return false;
        delete [] lb;
        return true;
    }
};

文章来源地址https://www.toymoban.com/news/detail-800345.html

到了这里,关于算法专题:差分数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法】【差分数组】解决连续空间改变相同值的问题

    将原数组每个值减去前一个值,得到的新数组是差分数组 d i s [ k ] = a [ k ] − a [ k − 1 ] dis[k] = a[k] - a[k-1] d i s [ k ] = a [ k ] − a [ k − 1 ] 如: 原数组为 [ 1 , 2 , 3 , 5 ] [1,2,3,5] [ 1 , 2 , 3 , 5 ] 得到的差分数组为 [ 1 , 1 , 1 , 2 ] [1,1,1,2] [ 1 , 1 , 1 , 2 ] 通过计算差分数组的前缀和,可以得

    2024年02月08日
    浏览(75)
  • 【LeetCode: 167. 两数之和 II - 输入有序数组 | 双指针专题 】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年02月13日
    浏览(39)
  • 算法通关村-----数组实现加法专题问题解析

    给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。详见leetcode66 可以从数组的末尾,即length-1下标处开始向前遍历,末尾元素➕

    2024年02月10日
    浏览(49)
  • 【算法专题--双指针算法】leetcode--283. 移动零、leetcode--1089. 复写零

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 双指针 常见的双指针有两种形式,一种是对撞指针,⼀种是左右指针。 对撞指针:一般用于顺序结构中

    2024年03月17日
    浏览(45)
  • 【LeetCode 算法专题突破】滑动窗口(⭐)

    学完了双指针算法,滑动窗口那肯定是逃不掉了,我个人感觉他俩就不分家,不把滑动窗口的题目好好刷上一刷我都难受 先来一道经典的滑动窗口试试水 题目链接:209. 长度最小的子数组 其实滑动窗口题目的解法都大同小异,我们基本上写几道题目,就能很好的掌握这个算

    2024年02月07日
    浏览(53)
  • 算法通关村十三关 | 数组字符串加法专题

    题目:LeetCode66,66. 加一 - 力扣(LeetCode) 我们只需要从头到尾依次运算,用常量标记是否进位,需要考虑的特殊情况是digits = [9,9,9]的时候进位,我们组要创建长度加1的数组,首位添加为1即可。         给定两个非负形式的字符串num1和num2,计算他们的和以字符串形式返

    2024年02月11日
    浏览(42)
  • 【算法专题突破】滑动窗口 - 长度最小的子数组(9)

    目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 题目链接:209. 长度最小的子数组 - 力扣(Leetcode)  要注意的是,题目给的是正整数, 而题目要求并不难理解,就是找最短的子数组。 如果使用暴力的话,就是一个O(N3)的算法,复杂度很高, 我们可以用滑动窗口来做,

    2024年02月09日
    浏览(32)
  • leetcode — JavaScript专题(五):计数器 II、只允许一次函数调用、 创建 Hello World 函数、将对象数组转换为矩阵、节流、分块数组

    专栏声明:只求用最简单的,容易理解的方法通过,不求优化,不喜勿喷 题面 请你写一个函数 createCounter. 这个函数接收一个初始的整数值 init 并返回一个包含三个函数的对象。 这三个函数是: increment() 将当前值加 1 并返回。 decrement() 将当前值减 1 并返回。 reset() 将当前值

    2024年02月03日
    浏览(48)
  • 【LeetCode 热题 100】矩阵 专题(大多原地算法,需要一定思维)

    解题思路 在 代码注释中!

    2024年02月15日
    浏览(51)
  • LeetCode刷题笔记【23】:贪心算法专题-1(分发饼干、摆动序列、最大子序和)

    贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿? 指定每次拿最大的,最终结果就是拿走最大数额的钱。 每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。 感觉像

    2024年02月09日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包