532. 逆序对

描述:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的总数。
概括:如果a[i] > a[j] 且 i < j, a[i] 和 a[j] 构成一个逆序对。
思路:归并排序,在每次递归调用中,先对左半部分排序,然后统计右半部分每个值在左半部分的逆序对数

class Solution {
public:
    /**
     * @param A: an array
     * @return: total of reverse pairs
     */
    long long reversePairs(vector<int> &A) {
        // write your code here
        int ans = 0;
        int len = A.size();
        ans = DFS(A,0,A.size());
        return ans;
    }
    int DFS(vector<int> &A,int left,int right)
    {
        if( right - left <= 1)
        {
            return 0;
        }
        int mid = (left + right) >> 1;
        int res = DFS(A,left,mid) + DFS(A,mid,right);
        sort(A.begin() + left,A.begin() + mid);
        for( int i = mid;i < right; ++i )
        {
            res += A.begin() + mid - std::upper_bound(A.begin() + left,A.begin() + mid,A[i]);
        }
        return res;
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,421评论 0 2
  • 描述 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆...
    6默默Welsh阅读 478评论 0 0
  • 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。给你一个数组,求出这个数组中逆序对的...
    goodAndBad阅读 170评论 0 0
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,286评论 0 2
  • 1 初级排序算法 排序算法关注的主要是重新排列数组元素,其中每个元素都有一个主键。排序算法是将所有元素主键按某种方...
    深度沉迷学习阅读 1,463评论 0 1