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. L006-oldboy-mysql-dba-lesson06

    L006-oldboy-mysql-dba-lesson06 数据清理状态,先标记update table state=1,再删除. myisam没外键,硬件,并发,锁表力度,不支持事务,OLAP. ...

  2. Winform DataGridView单元格的提示信息

    往往当单元格的内容过多时,显示会变成这样 后缀多了几个点来显示数据未完,当鼠标移到某个单元格时,单元格里的内容会全部显示. 今天偶然发现了一个可以修改提示信息的方法,所以先记下来. 这个方法,可以对于 ...

  3. C# login with cookie and fiddler2

    http://blog.codeblack.nl/post/HttpWebRequest-HttpWebResponse-and-cookies.aspx CookieContainer cookie ...

  4. html 元素添加 class

    <!-- 给 input 添加 class 一个input 可以添加多个class 中间空格隔开. --> @Html.TextBox("txtIDNumber", & ...

  5. 百度地图api的实现

    获取客户端IP地址经纬度所在城市 <?php $getIp=$_SERVER["REMOTE_ADDR"]; echo 'IP:',$getIp; echo ''; $con ...

  6. 浏览器内核-Webkit

    关键字:浏览器内核,浏览器引擎,Browser,Webkit,Blink,Chromium. 本文简单介绍一下各种浏览器内核.着种介绍一下Webkit.顾名思义,浏览器内核就是浏览器的核心部分,也可以 ...

  7. Java实现MySQL在线管理

    问题: 1.如何实现在线创建MySQL数据库.表: 2.如何实现在线执行sql语句? 思路: 1.可以通过java.sql.Statement类的executeUpdate(String sql)方法 ...

  8. Asp.net之LINQ入门视频教程

    当前位置: 主页 > 编程开发 > Asp.net视频教程 > Asp.net之LINQ入门视频教程 > http://www.xin1234.com/Program/Aspn ...

  9. Oracle bug 使用max或min函数into到一个char类型报字符缓冲区太小的错误

    这个BUG出现会报错如下: selectto_char(max(RENEWAL_DATE)) intoM_YEAR_MONTH fromt_renewal_schedule; ORA-06502: P ...

  10. js中arguments的作用

    在javascript函数体内,标识符arguments具有特殊含义.它是调用对象的一个特殊属性,用来引用Arguments对象. Arugments对象就像数组,注意这里只是像并不是哈. javas ...