zoukankan      html  css  js  c++  java
  • [剑指Offer] 35.数组中的逆序对

    题目描述

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

    【思路】看到这样的题目,最简单的想法就是遍历每一个元素,让其与后面的元素对比,如果大于则count++,但是这样的时间复杂度是o(n2),根据题目给出的数据量,很明显超时。因此想到了用归并排序的思想。

     1 class Solution {
     2 public:
     3     void MergeCount(vector<int>& data, int begin, int mid, int end, int& count)
     4     {
     5         int i = begin, j = mid;
     6         int temp[end - begin],  k = 0;
     7         while(i < mid && j < end)
     8         {
     9             if(data[i] < data[j])
    10             {
    11                 temp[k++] = data[i++];
    12             }
    13             else
    14             {
    15                 count += mid - i;
    16                 if(count > 1000000007) count %= 1000000007;
    17                 temp[k++] = data[j++];
    18             }
    19         }
    20         while(i < mid) temp[k++] = data[i++];
    21         while(j < end) temp[k++] = data[j++];
    22         for(int s = 0; s < end - begin; ++s) data[s + begin] = temp[s];
    23     }
    24     void MergeSort(vector<int>& data, int begin, int end, int& count)
    25     {
    26         if(begin + 1 == end) return;
    27         int mid = (begin + end) / 2;
    28         MergeSort(data, begin, mid,count);
    29         MergeSort(data, mid, end, count);
    30         MergeCount(data, begin, mid, end, count);
    31     }
    32     int InversePairs(vector<int> data)
    33     {
    34         int n = static_cast<int>(data.size());
    35         if(n == 0 || n == 1) return 0;
    36         int count = 0;
    37         MergeSort(data,0, n, count);
    38         return count;
    39     }
    40 };
  • 相关阅读:
    SQL
    第九章
    第三章 表单
    第二章 表格,列表,媒体元素
    HTML5基础
    Java第一本书总复习
    字符串
    人机猜拳
    类的无参方法
    类和对象
  • 原文地址:https://www.cnblogs.com/lca1826/p/6514008.html
Copyright © 2011-2022 走看看