C++中的sort函数和swap函数 前缀和与差分

一、sort函数

sort函数的头文件为: #include<algorithm>;

常用格式:sort(vec.begin(),vec.end()) :对向量进行升序排列;

sort(num,num+n):对数组num的0~n-1元素进行升序排序。

如果想要降序排列:sort(begin_pointer,begin_pointer+n,cmp)

其中,可以调用自己定义的cmp函数达到降序排列的目的

bool cmp(int a,int b)
{
      return a>b;
 }

二、swap函数

swap函数的头文件为: #include<algorithm>

因为 swap 函数的参数是两个地址,所以这样调用它:

swap(&i, &j);

作用为:交换两个数值的值

C++也可以使用引用,swap 可以这样写:

void swap(int &a, int &b)
{
    int k = a;
    a = b;
    b = k;
}

三、前缀和 

前缀和的思路是这样的,对于一个给定的数组 nums,我们额外开辟一个前缀和数组进行预处理:

int n = nums.length;
// 前缀和数组
int[] preSum = new int[n + 1];
preSum[0] = 0;
for (int i = 0; i < n; i++)
    preSum[i + 1] = preSum[i] + nums[i];

这个前缀和数组 preSum 的含义,preSum[i] 就是 nums[0..i-1] 的和。那么如果我们想求 nums[i..j] 的和,只需要一步操作 preSum[j+1]-preSum[i] 即可,而不需要重新去遍历数组了。

四、差分 

如果数组A是B的前缀和,则B是A的差分。
我们构造一个数组的差分矩阵,是为了针对频繁的对数组中某个区间进行同一操作。例如将序列中[l, r]之间的每个数加上c这一操作,可能执行n次,每次的c不同,如果对原数组进行操作,每次操作都会花费O(n)的时间复杂度。如果使用该数组的差分数组进行操作,每次操作为O(1)。然后求差分数组的前缀和即为所求结果。

差分数组

针对[l, r]之间的每个数加上c这一操作

let diffCreate = (c, l, r) => {
    diffArr[l] += c;
    diffArr[r + 1] -= c;
}

这是差分数组操作的核心,对于原数组区间中每个数都要操作,而差分数组就只要操作两个数。因为原数组是差分数组的前缀和,所以第l个数加c,后面每个数都会加c,再把不需要的部分(r后面的数)减去c。

针对原数组快速构造差分数组

把原数组a看作全0数组b,每个位置上的数看作一次差分操作。比如说如果a[1]=2,那么对全0数组b进行diffCreate(1,1,2)操作,相当于把从1到1区间(其实就一个数)上的每个数加2。所有的数操作后得到的b就是a的差分数组。

差分矩阵也是同理。

let diffCreate = (c, x1, y1, x2, y2) => {
    diffArr[x1][y1] += c;
    diffArr[x2 + 1][y1] -= c;
    diffArr[x1][y2 + 1] -= c;
    diffArr[x2 + 1][y2 + 1] += c;
}

注意:不论是差分数组还是差分矩阵下标都要从1开始(a[1]、a[2][3]),而且前面的0位置(a[0]、a[0][0]、a[1][0])都要置为0。因为求前缀和时(也就是求原数组)会用到,为了同一操作而不对0处进行特殊判断,所以为0写起来更方便。

  • 13
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值