• 归并排序相关问题


    归并排序模板:

    void merge(vector<int>& nums, int l, int r){
            if ( l >= r) return 0;//只有一个数
            int mid = l+r >>1;
            //递归左右排序
            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++]);
            }
            while(i <= mid) temp.push_back(nums[i++]);
            while( j <= r) temp.push_back(nums[j++]);
            i = l;
            //复制回原数组
            for(auto x: temp) nums[i++] = x;
        }

    1、求数组逆序对:

    在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。

    输入一个数组,求出这个数组中的逆序对的总数。

    在归并排序中,返回int用来计算逆序对;

    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(auto x: temp) nums[i++] = x;
            /*for(int i = l ; i <= r; i++) cout << nums[i] << ' ';
            cout << endl;*/
            return res;
        }
        int inversePairs(vector<int>& nums) {
            return merge(nums,0,nums.size()-1);
        }
    };
  • 相关阅读:
    11月12号实验课
    10月29日实验
    10.15实验课作业
    Idea的使用和设置
    常用的Linux命令
    KAFKA总结
    SpringBoot+Maven+MyBaties+Mysql快速搭建一个项目
    Spring 常见面试
    Windows下安装ZK kafka Mysql dubbo redis
    MySQL常见的面试题
  • 原文地址:https://www.cnblogs.com/Aliencxl/p/12366187.html
Copyright © 2020-2023  润新知