【剑指offer】求逆序对的个数
2013-09-07 10:50:31
面试题36:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字构成一个逆序对。输入一个数组,求出这个数组中逆序对的总数。
小结:
- 最直观的的方法是:对每个数字,测试后面的数字是否小于该数字,这种方法的时间复杂度为O(N^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】求逆序对的个数的更多相关文章
- 剑指 Offer 40. 最小的k个数 + 优先队列 + 堆 + 快速排序
剑指 Offer 40. 最小的k个数 Offer_40 题目描述 解法一:排序后取前k个数 /** * 题目描述:输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7. ...
- 剑指 Offer 40. 最小的k个数
剑指 Offer 40. 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:ar ...
- 【剑指Offer】最小的K个数 解题报告(Python)
[剑指Offer]最小的K个数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...
- 【Java】 剑指offer(40) 最小的k个数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...
- Go语言实现:【剑指offer】最小的K个数
该题目来源于牛客网<剑指offer>专题. 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. Go语言实现: fu ...
- 《剑指offer》最小的k个数
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- 剑指offer 二进制1中的个数
算法-求二进制数中1的个数 问题描述 任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4 这也是一道比较经典的题目了, ...
- 每日一题 - 剑指 Offer 40. 最小的k个数
题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 快排 难易程度:中等 题目描述: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3. ...
- 约瑟夫环形链表问题、丢手帕问题、剑指offer圆圈中最后一个数问题
public class Solution { // 左神解法,本题本质还是报数为m-1的倍数的人死.求最后一个活着的人是初始时候的哪个人 /* 报数(A) 实际人员编号(B) ...
随机推荐
- spring 中的 RowMapper
spring 中的 RowMapper sping中的RowMapper可以将数据中的每一行数据封装成用户定义的类. 我们在数据库查询中,如果返回的类型是用户自定义的类型(其实我们在数据库查询中 ...
- winfrom 水晶按钮
闲来无事,从网上找了不少自定义控件,然后整理了一下,做了一个水晶按钮 /// <summary> /// 表示 Windows 的按钮控 /// </summary> [Des ...
- mac安装memcache
1.wget http://blog.s135.com/soft/linux/nginx_php/memcache/memcache-2.2.5.tgz 2.tar zxvf memcache-2.2 ...
- 在Linux环境下给php添加mbstring扩展
1,今天在开发项目的时候使用了一个php函数(mb_strcut),运行代码时候提示报错"call to undefind function mb_strcut",首先检查下函数名 ...
- php header头信息 举例
发布:sunday01 来源:Net [大 中 小] 转自:http://www.jbxue.com/article/6915.html 用于演示PHP header()函数用法的代码,介 ...
- 在制作joomla模板过程中遇到的问题
'''问题1.'''在jjc首页中两个通知公告和基建首页的两个模块中,当我点击查看文章标题是,而通知公告和最新动态页一直都还显示,发现文章一直在网站的下部,而不显示在它应该显示的main_rigth模 ...
- Linux配置Tomcat(转载)
转载自:http://www.cnblogs.com/zhoulf/archive/2013/02/04/2891633.html 安装说明 安装环境:CentOS-6.3安装方式:源码安装 软件:a ...
- (转载)Cocos2dx-OpenGL ES2.0教程:初识MVP(3)
在上一篇文章中,我在介绍vertex shader的时候挖了一个坑:CC_MVPMatrix.它其实是一个uniform,每一个cocos2d-x预定义的shader都包含有这个uniform, 但是 ...
- OO之观察者模式
以下为观察者模式详解: 引子: 假设有这样一个问题,有一条河经过一个山谷,山谷下有一个村庄,人们在山谷处修建了一个水库,并安排专人管理,当水库的水位过高时要通知下游居民注意水库的开闸放水,当水库的水温 ...
- python总字符串
前面我们讲解了什么是字符串.字符串可以用''或者""括起来表示. 如果字符串本身包含'怎么办?比如我们要表示字符串 I'm OK ,这时,可以用" "括起来表示 ...