面试题36_数组中的逆序对

题目描述

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

解题思路

思路一:暴力搜索,一次判断每一个数,其之后的数有没有比它小的,若有则计数加一。时间O(n^2)

思路二:利用归并排序方法,在归并的时候,计算逆序对数目。具体过程看代码。 时间O(nlogn)

实现代码

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

        if(data.empty())
            return 0;
        int len = data.size();
        vector<int>  copy(len,0);

        int result=0;
        result = mergeSort(data, copy,0,len-1);

        return result;
    }

    int mergeSort(vector<int> &data, vector<int> &copy, int start, int end)
    {
    	if(start == end)
        {
        	copy[start] = data[end];
            return 0;
        }

        int mid = (end+start)/2;
        int left = mergeSort(data,copy,start, mid);
        int right = mergeSort(data,copy, mid+1,end);
        int count = merge(data,copy,start,mid,end);

        return left + right +count;
    }

    int merge(vector<int> &data, vector<int> &copy, int start, int mid, int end)
    {
    	int lBegin = start, lEnd = mid;
        int rBegin = mid+1, rEnd = end;
        int k=end;
        int count = 0;
        while(lEnd >= lBegin && rEnd >= rBegin)
        {
        	if(data[lEnd] > data[rEnd])
            {
           	count += rEnd-rBegin+1;//计算逆序对
                copy[k--] = data[lEnd--];
            }
            else
                copy[k--] = data[rEnd--];
        }

        while(lBegin <= lEnd)
            copy[k--] = data[lEnd--];

        while(rBegin <= rEnd)
            copy[k--] = data[rEnd--];

      	for(int i=start ; i<=end; i++)
            data[i] = copy[i];

        return count;
    }
};
时间: 2024-09-29 09:20:06

面试题36_数组中的逆序对的相关文章

剑指offer 面试题36—数组中的逆序对

题目: 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数.例如在数组{7,5,6,4}中一共存在5对逆序对,分别是(7,6),(7,5),(7,4),(6,4),(5,4) 基本思想: 解法一:O(n^2) 最简单的想法就是遍历每一个元素,让其与后面的元素对比,如果大于则count++,但是这样的时间复杂度是O(n^2). 解法二:O(nlogn) 归并排序思路: 例如7,5,4,6可以划分为两段7,5和4,6两个子数组 1

面试题36 数组中的逆序对

题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 1 class Solution { 2 public: 3 int InversePairsCore(vector<int> &data,vector<int>&copy,int start,int end) 4 { 5 if(start==end) 6 { 7 copy[start]=data[start]; 8 return

剑指Offer 面试题36:数组中的逆序对及其变形(Leetcode 315. Count of Smaller Numbers After Self)题解

剑指Offer 面试题36:数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 例如, 在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4),输出5. 提交网址: http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188 或 htt

【剑指offer】面试题51:数组中的逆序对

题目 * 面试题51:数组中的逆序对 * 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对. * 输入一个数组,求出这个数组中的逆序对的总数P. * 并将P对1000000007取模的结果输出. 即输出P%1000000007 思路 1.暴力 ,时间复杂度O(n^2) 2.归并排序的思路 :时间复杂度O(nlogn) * (1) 先将数组分成两半,递归分别计算左半边的逆序对数目leftCnt 和右半边的逆序对数目rightCnt * (2)再计算合并之后新增的逆序对

【剑指Offer学习】【面试题36:数组中的逆序对】

题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 举例分析 例如在数组{7, 5, 6, 4 中, 一共存在5 个逆序对,分别是(7, 6).(7,5),(7, 4).(6, 4)和(5, 4). 解题思路: 第一种:直接求解 顺序扫描整个数组.每扫描到一个数字的时候,逐个比较该数字和它后面的数字的大小.如果后面的数字比它小,则这两个数字就组成了一个逆序对.假设数组中含有n 个数字.由于每个数字都要和O(n)个数字作

剑指Offer面试题36(Java版):数组中的逆序对

题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数 例如在数组{7,5,6,4}中,一共存在5对逆序对,分别是{7,6},{7,5},{7,4},{6,4},{5,4}. 看到这个题目,我们的第一反应就是顺序扫描整个数组.每扫描到一个数组的时候,逐个比较该数字和它后面的数字的大小.如果后面的数字比它小,则这两个数字就组成一个逆序对.假设数组中含有n个数字.由于每个数字都要和O(n)个数字做比较,因此这个算法的时间复杂度为

剑指offer——面试题36:数组中的逆序对(归并排序)

题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路: 采用归并排序的思想,将数组中的元素分割成子数组,先统计出子数组里的逆序对的个数.同时将这些子数组的数字排成有序的 慢慢往多的合并,在合并的过程中一面统计逆序对的个数,一面合并成一个数组时将里面排好序. 和合并排序类似,时间复杂度为O(nlogn) 下面是详细代码: #include<iostream> #include<vector> usi

(剑指Offer)面试题36:数组中的逆序对

题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路: 1.顺序扫描 顺序扫描整个数组,每扫描到一个数字,就将该数字跟后面的数字比较,如果大于的话,则这两个数字构成了逆序对.(比较简单,这里就不贴出代码) 时间复杂度:O(n^2) 2.归并思想 将数组不断地等分为两个子数组,然后自下而上地统计两个子数组各自的逆序对以及合并后的逆序对. 假设两个子数组左右分别为A,B,长度分为lenA,lenB,子数组已排好序,

面试题36:数组中的逆序对(归并排序思想)

在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数.例如,有一个数组为Array[0..n] 其中有元素a[i],a[j].如果 当i<j时,a[i]>a[j],那么我们就称(a[i],a[j])为一个逆序对.在数组{7,5,6,4}中一共存在5对逆序对,分别是(7,6),(7,5),(7,4),(6,4),(5,4). 最简单的想法就是遍历每一个元素,让其与后面的元素对比,如果大于则count++,但是这样的时间复杂度是o