zoukankan      html  css  js  c++  java
  • 【剑指offer】题目36 数组中的逆序对

    数组中任取两个数字,如果前面的数字大于后面的数字称为一个逆序对

    如:1,2,1,2,1 有3个逆序对

    思路:知道O(N2)肯定是错的。开始想hash,试图找到O(n)的算法,想了很久,找不到。后来想到排序,用原数组与排好序的数组对比,我写的快排,还是不对。想了几个小时,无奈看答案,原来是用变形的归并排序。排序真是博大精深,换个样子我就想不到了....

    在牛客网上AC的代码:脑子不清醒,各种小错,提交了好多遍。

    class Solution {
    public:
        void myMergeSort(vector<int> &data, int & ans, int l, int r, vector<int> &v)
        {
            if(l >= r) return;
            int m = l + (r - l) / 2;
            myMergeSort(data, ans, l, m, v);
            myMergeSort(data, ans, m + 1, r, v);
            myMerge(data, ans, l, m, r, v);
              
        }
        void myMerge(vector<int> &data, int & ans, int l, int m, int r, vector<int> &v)
        {
            int n1 = m - l + 1;
            int k = 0, i = l, j = m + 1;
            while(i <= m && j <= r)
            {
                if(data[i] <= data[j])
                {
                    v[k++] = data[i++]; 
                }
                else
                {
                    v[k++] = data[j++];
                    ans += m - i + 1;
                }
            }
            while(i <= m)
                v[k++] = data[i++];
            while(j <= r)
                v[k++] = data[j++];
            for(k = 0; k < r - l + 1; k++)
                data[k + l] = v[k];
        }
        int InversePairs(vector<int> data) {
            int ans = 0;
            vector<int> v(data.size());
            myMergeSort(data, ans, 0, data.size() - 1, v);
            return ans;
        }
    };
  • 相关阅读:
    映射和分析
    文档操作
    向 Nginx 主进程发送 USR1 信号
    ES集群7.3.0设置快照,存储库进行索引备份和恢复等
    ES7.3.0配置邮件告警
    Elasticsearch 史上最全最常用工具清单
    Grok在线调试网址
    Linux 小知识翻译
    Linux 小知识翻译
    Linux 小知识翻译
  • 原文地址:https://www.cnblogs.com/dplearning/p/4634544.html
Copyright © 2011-2022 走看看