zoukankan      html  css  js  c++  java
  • 剑指offer---数组中的逆序对

    题目:数组中的逆序对

    要求:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007


    输入:

    • {7, 5, 6, 4}

    逆序对:

    • {7, 5}
    • {7, 6}
    • {7, 4}
    • {5, 4}
    • {6, 4}

    输出:

    • 5

    class Solution {
    public:
        int InversePairs(vector<int> data) {
            
        }
    };

    解题代码:

    class Solution {
    public:
        int InversePairs(vector<int> data) {
            int count = 0;
            int len = data.size();
            for(int seg = 1; seg <= len; seg *= 2){
                for(int start = 0; start <= len; start += 2 * seg){
                    int low = start;
                    int mid = min(start + seg - 1, len-1);
                    int high = min(start + 2 * seg - 1, len-1);
                    /**
                     * 利用归并排序思想:
                     * 把待排序部分data[low,...,high]分成前后两部分,每部分长度为seg
                     * 前一部分:data[start1,...,end1]
                     * 后一部分:data[start2,...,end2]
                     */
                    int start1 = low, end1 = mid;
                    int start2 = end1 + 1, end2 = high;
                    deque<int> q; // 将data数组从low到high元素的排序结果存储在q中
    
                    while(end1 >= start1 && end2 >= start2){
                        if(data[end1] > data[end2]){
                            count = count + end2 - start2 + 1;
                            if(count >= 1000000007) // 数值过大求余
                                count %= 1000000007;
                            q.push_front(data[end1--]);
                        }
                        else
                            q.push_front(data[end2--]);
                    }
                    // 剩余部分
                    while(start1 <= end1)
                        q.push_front(data[end1--]);
                    while(start2 <= end2)
                        q.push_front(data[end2--]);
    
                    //  将从low到high的排序结果在data数组中更新
                    for(deque<int>::iterator it = q.begin(); it != q.end(); it++)
                        data[start1++] = *it;
                    q.shrink_to_fit();
                }
            }
            return count;
        }
    };
  • 相关阅读:
    Castle.Aop.Autofac
    signalR 在webfarm下的配置
    SQL语句中 string类型数字的比较
    access 查询空字段
    c#利用jmail发送邮件
    C# 利用Jmail接收邮件
    Asp.net 使用 AXAJ局部刷新无效的解决方法
    把查询的数据放入多维数组中
    获取网站的根目录的物理文件系统路径
    C#.net如何生成静态页带母板的那种
  • 原文地址:https://www.cnblogs.com/iwangzhengchao/p/9966359.html
Copyright © 2011-2022 走看看