排序及数学专题

比较函数
内嵌基本用法:

struct node
{
   
    int l, r;
    bool operator< (const node &v)const{
   
        return r < v.r;
    }
} v[maxn];

结构体内嵌比较函数后可以直接sort(v, v+n);

和直接写一个比较的函数类似:

bool cmp(node a,node b){
   
   return a.r<b.r;
 }

再用sort(v, v+n, cmp)即可;

例如 结合优先队列的用法:

struct node
{
   
    int l, r;
    bool operator < (const node &v)const
    {
   
        return r  > v.r;
    }
};
priority_queue<node> q;

sort默认为从小到大排序,优先队列默认为从大到小。
所以这个优先队列是按r小的优先出队,因为根据结构体定义r小的node大

1 (merge-sorted-array)给出两个有序的整数数组A和B,请将数组B合并到数组A中,变成一个有序的数组
注意:
可以假设A数组有足够的空间存放B数组的元素,A和B中初始的元素数目分别为m和n

class Solution {
   
public:
    void merge(int A[], int m, int B[], int n) {
   
        int cur=m+n-1,p=m-1,q=n-1;
        while(p>=0&&q>=0){
   
            A[cur--]=A[p]>=B[q]?A[p--]:B[q--];
        }
        while(q>=0){
   
            A[cur--]=B[q--];
        }
    }
};

1. (数组中的逆序对)

class Solution {
   
public:

    int merge(vector<int>& nums,int l,int r){
   
        if(l>=r)return 0;
        int mid=(l+r)>>1;
        int res=merge(nums,l,mid)+merge(nums,mid+1,r);
        int i=l,j=mid+1;
        vector<int> temp;
        while(i<=mid&&j<=r){
   
            if(nums[i]<=nums[j])temp.push_back(nums[i++]);
            else {
   
                temp.push_back(nums[j++]);
                res+=mid-i+1;
            }
        }
        while(i<=mid)temp.push_back(nums[i++]);
        while(j<=r)temp.push_back(nums[j++]);
        i=l;
        for
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值