2013-09-07 10:50:31

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

小结:

  1. 最直观的的方法是:对每个数字,测试后面的数字是否小于该数字,这种方法的时间复杂度为O(N^2);
  2. 为了改善时间性能,用归并的方法,但这种方法组要辅助的空间O(N),见下面函数GetNumberOfInversePairs。

代码(测试暂未发现错误,欢迎交流指正!):

 #include <iostream>
#include <cassert>
using namespace std; typedef int DataType;
const int SIZE = ; //归并,返回逆序的个数
int Merge(DataType *array,int begin,int mid,int end)
{
int resLength = end - begin + ;
DataType *resArray = new DataType[resLength]; int index1 = mid;
int index2 = end; int cntOfInversePairs = ; while (index1 >= begin && index2 >= (mid + ))
{
if (array[index1] > array[index2])
{
resArray[--resLength] = array[index1--];
cntOfInversePairs += (index2 - mid); //逆序的个数为第二个数组中剩余的数字个数
}
else
{
resArray[--resLength] = array[index2--];
}
} while (index1 >= begin)
{
resArray[--resLength] = array[index1--];
} while (index2 >= (mid + ))
{
resArray[--resLength] = array[index2--];
} index1 = begin;
index2 = ; while (index1 <= end) //将排序后的数组复制到原数组中
{
array[index1++] = resArray[index2++];
} delete [] resArray;
return cntOfInversePairs;
} //递归求逆序对的个数
int GetNumberOfInversePairsRecursive(DataType *array,int begin,int end)
{
if (begin >= end)
{
return ;
} int mid = begin + (end - begin) / ; int cnt1 = GetNumberOfInversePairsRecursive(array,begin,mid);
int cnt2 = GetNumberOfInversePairsRecursive(array,mid + ,end); int cnt3 = Merge(array,begin,mid,end); return (cnt1 + cnt2 + cnt3);
} //返回逆序对的个数
int GetNumberOfInversePairs(DataType *array,int len)
{
assert(array != NULL);
assert(len >= ); return GetNumberOfInversePairsRecursive(array,,len - );
} //测试GetNumberOfInversePairs()
void TestGetNumberOfInversePairs()
{
DataType array[SIZE] = {,,,};
int len = ; cout<<"GetNumberOfInversePairs = "<<GetNumberOfInversePairs(array,len)<<endl;;
} int main()
{
TestGetNumberOfInversePairs();
return ;
}

【剑指offer】求逆序对的个数的更多相关文章

  1. 剑指 Offer 40. 最小的k个数 + 优先队列 + 堆 + 快速排序

    剑指 Offer 40. 最小的k个数 Offer_40 题目描述 解法一:排序后取前k个数 /** * 题目描述:输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7. ...

  2. 剑指 Offer 40. 最小的k个数

    剑指 Offer 40. 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:ar ...

  3. 【剑指Offer】最小的K个数 解题报告(Python)

    [剑指Offer]最小的K个数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...

  4. 【Java】 剑指offer(40) 最小的k个数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...

  5. Go语言实现:【剑指offer】最小的K个数

    该题目来源于牛客网<剑指offer>专题. 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. Go语言实现: fu ...

  6. 《剑指offer》最小的k个数

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  7. 剑指offer 二进制1中的个数

    算法-求二进制数中1的个数 问题描述 任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4 这也是一道比较经典的题目了, ...

  8. 每日一题 - 剑指 Offer 40. 最小的k个数

    题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 快排 难易程度:中等 题目描述: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3. ...

  9. 约瑟夫环形链表问题、丢手帕问题、剑指offer圆圈中最后一个数问题

    public class Solution { // 左神解法,本题本质还是报数为m-1的倍数的人死.求最后一个活着的人是初始时候的哪个人       /* 报数(A) 实际人员编号(B)      ...

随机推荐

  1. struts2 的action 向页面传值

    写一个Action类: public class LoginAction{ public String execute(){ return SUCCESS; } public void setValu ...

  2. web组件新学--layer

    在之前项目后台管理界面开发中,不知道有layer这样好用的组件,我的内心是这样的的...呀!这个框架有弹框,哈哈哈,好开心,不用自己写遮罩层,不用自己写弹框,好开森.. 当知道有layer之后.... ...

  3. TweenMax动画库学习(五)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  4. php微信支付(仅pc端扫码支付模式二)详细步骤.----仅适合第一次做微信开发的程序员

    本人最近做了微信支付开发,是第一次接触.其中走了很多弯路,遇到的问题也很多.为了让和我一样的新人不再遇到类似的问题,我把我的开发步骤和问题写出来,以供参考. 开发时间是2016/8/10,所以微信支付 ...

  5. linux 正则表达式深度解析

    正则表达式的文法分为3种标准:BRE.ERE 和 ARE.其中 BER 和 ERE 属于 POSIX 标准,ARE 则是由各家定义的扩展   简介 大体来讲,正则表达式的文法分为3种标准:BRE.ER ...

  6. Windows Service 访问远程共享权限设置

    最近为实现共享目录之间的文件同步,开发了一个Windows Service. 考虑到在拷贝过程中,如果网络忽然抽风访问不了,导致文件拷贝不完整的情况,果断抛弃.Net 自带的 COPY 方法,而使用D ...

  7. PCB优化设计(二) 转载

    PCB优化设计(二) 2011-04-25 11:41:05|  分类: PCB设计   目 前SMT技术已经非常成熟,并在电子产品上广泛应用,因此,电子产品设计师有必要了解SMT技术的常识和可制造性 ...

  8. mysql慢查询优化之explain的各列含义

    mysql> explain select customer_id,first_name,last_name from customer; +----+-------------+------- ...

  9. 浅淡Windows7 32位与64位/x86与x64的区别

    看到有很多会员问到底是选Windows7 x86,还是选x64.这里简单的谈一下这这两种系统的区别. 简单的说x86代表32位操作系统  x64代表64位操作系统. 简单的判断电脑是否支持64位操作系 ...

  10. unity手游之聊天SDK集成与使用二

    集成思路 如果是自己的小游戏的话,可以把好友等信息直接保存在亲加服务器上,通过调用api来操作. 我们游戏只使用sdk的通信功能,好友等信息保存在自己的服务器上. 用户在登陆游戏的时候,通过算法用用户 ...