【剑指offer】数组中的逆序对
版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/mmc_maodun/article/details/27520535
转载请注明出处:http://blog.csdn.net/ns_code/article/details/27520535
- 题目描写叙述:
- 在数组中的两个数字。假设前面一个数字大于后面的数字,则这两个数字组成一个逆序对。
输入一个数组。求出这个数组中的逆序对的总数。
- 输入:
-
每一个測试案例包括两行:第一行包括一个整数n,表示数组中的元素个数。
当中1 <= n <= 10^5。
第二行包括n个整数,每一个数组均为int类型。
- 输出:
- 相应每一个測试案例。输出一个整数,表示数组中的逆序对的总数。
- 例子输入:
-
4
7 5 6 4
- 例子输出:
-
5
剑指offer给出了归并排序的思路。这个有点难想到啊,也可能是我太弱了,根本没往这方面想!理解了思路。就不难了,将数组划分成两个子数组。再将子数组分别划分成两个子数组。统计每一个子数组内的逆序对个数,并将其归并排序。再统计两个子数组之间的逆序对个数,并进行归并排序。
这就是归并排序的变种,在归并排序代码的基础上稍作改进就可以。
#include<stdio.h>
#include<stdlib.h>
/*
统计两个子数组之间的逆序对
*/
long long MergePairsBetweenArray(int *arr,int *brr,int start,int mid,int end)
{
int i = mid;
int j = end;
int k = end; //辅助数组的最后一位
long long count = 0;
//设置两个指针i,j分别从右往左依次比較。
//将较大的依次放入辅助数组的右边
while(i>=start && j>=mid+1)
{
if(arr[i] > arr[j])
{
count += j-mid;
brr[k--] = arr[i--];
}
else
brr[k--] = arr[j--];
}
//将当中一个数组中还剩下的元素复制到辅助数组中。
//两个循环仅仅会运行当中的一个
while(i>=start)
brr[k--] = arr[i--];
while(j>=mid+1)
brr[k--] = arr[j--];
//从辅助数组中将元素复制到原数组中。使其有序排列
for(i=end;i>k;i--)
arr[i] = brr[i];
return count;
}
/*
统计数组中的全部的逆序对
*/
long long CountMergePairs(int *arr,int *brr,int start,int end)
{
long long PairsNum = 0;
if(start<end)
{
int mid = (start+end)>>1;
PairsNum += CountMergePairs(arr,brr,start,mid); //统计左边子数组的逆序对
PairsNum += CountMergePairs(arr,brr,mid+1,end); //统计右边子数组的逆序对
PairsNum += MergePairsBetweenArray(arr,brr,start,mid,end); //统计左右子数组间的逆序对
}
return PairsNum;
}
/*
将函数封装起来
*/
long long CountTotalPairs(int *arr,int len)
{
if(arr==NULL || len<2)
return 0;
int *brr = (int *)malloc(len*sizeof(int));
if(brr == NULL)
exit(EXIT_FAILURE);
long long sum = CountMergePairs(arr,brr,0,len-1);
free(brr);
brr = NULL;
return sum;
}
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
int *arr = (int *)malloc(n*sizeof(int));
if(arr == NULL)
exit(EXIT_FAILURE);
int i;
for(i=0;i<n;i++)
scanf("%d",arr+i);
printf("%lld\n",CountTotalPairs(arr,n));
free(arr);
arr = NULL;
}
return 0;
}
/**************************************************************
Problem: 1348
User: mmc_maodun
Language: C
Result: Accepted
Time:100 ms
Memory:1696 kb
****************************************************************/
【剑指offer】数组中的逆序对的更多相关文章
- [剑指OFFER] 数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 分析:利用归并排序的思想,分成2部分,每一部分按照从大到 ...
- 剑指Offer——数组中的逆序对
题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%100 ...
- 用js刷剑指offer(数组中的逆序对)
题目描述 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P ...
- 剑指Offer——数组中的逆序对(归并排序的应用)
蛮力: 遍历数组,对每个元素都往前遍历所有元素,如果有发现比它小的元素,就count++. 最后返回count取模. 结果没问题,但超时哈哈哈,只能过50%. 归并法: 看讨论,知道了这道题的经典 ...
- 剑指 Offer——数组中的逆序对
1. 题目 2. 解答 借助于归并排序的分治思想,在每次合并的时候统计逆序对.因为要合并的两个数组都是有序的,如果左半部分数组当前值大于右半部分数组当前值,那么左半部分数组当前值右边的数就都大于右半部 ...
- 剑指offer_数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P. 并将P对1000000007取模的结果输出. 即输出P%100 ...
- 剑指Offer-34.数组中的逆序对(C++/Java)
题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%10000 ...
- 剑指Offer34 数组中的逆序对
/************************************************************************* > File Name: 34_Invers ...
- 剑指offer-数组中的逆序对-数组-python
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- 剑指 Offer —— 数组中重复的数字
数组中的重复数字 题目描述 牛课网链接 长度为 n 的数组里,所有数字都在 0 到 n-1 的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一 ...
随机推荐
- Ubuntu14.04搭建Oracle instantClient 11.2.0.4并配置cx_Oracle5.1.2
一.配置Oracle instantClient 11.2.0.4 1.下载Oracle客户端: 打开http://www.oracle.com/technetwork/topics/linuxx86 ...
- 阿里云配置HTTPS
阿里云配置HTTPS 2018-05-29 16:00:56 by SemiconductorKING 最近申请域名配置了一下HTTPS协议,记录一下配置过程. 准备 备案过的域名,一个SSL证书(免 ...
- golang学习之闭包
匿名函数不能够独立存在,但可以被赋值于某个变量,即保存函数的地址到变量中:fplus := func(x, y int) int { return x + y },然后通过变量名对函数进行调用:fpl ...
- MongoDb 学习笔记(一) --- MongoDb 数据库介绍、安装、使用
1.数据库和文件的主要区别 . 数据库有数据库表.行和列的概念,让我们存储操作数据更方便 . 数据库提供了非常方便的接口,可以让 nodejs.php java .net 很方便的实现增加修改删除功能 ...
- [javaEE] 三层架构案例-用户模块(二)
使用junit测试框架,测试查找用户和添加用户功能 com.tsh.test.xmlUserDaoTest package com.tsh.test; import org.junit.Test; i ...
- 一:Maven知识整理
一:maven的好处 1.依赖管理:对jar包的统一管理 可以节省空间 2.项目一键构建: 编码 编译 测试(junit) 运行 打包 部署 一个 tomcat:run就能把项目运行起来 Maven能 ...
- shell变量类型和运算符
一.shell变量的应用 1.shell变量的种类 ①用户自定义变量:由用户自己定义,修改和使用 ②预定义变量:bash预定义的特殊变量,不能直接修改 ③位置变量:通过命令行给程序传递执行参数 二.变 ...
- 多实例部署多个tomcat
注意点: 1.多实例tomcat的更新维护,需要考虑如何能“优雅”地对所有实例进行升级: 2.尽量不要影响应用程序,在更新tomcat时,一不小心就把conf目录等全部覆盖,所以尽量要把配置文件和安装 ...
- jquery中的$().each和$.each的区别
jquery中的$().each和$.each的区别 注意:jquery中的$().each和$.each的区别,前者只能遍历数组,后者可以遍历数组和对象 备注:sinobook项目中地名本体相关地按 ...
- Strapi 安装易错位置
Strapi官网(https://strapi.io)介绍:最先进的开源内容管理框架,可以毫不费力地构建功能强大的API,建立在Node.js平台之上,为您的API提供高速惊人的表现. 简单点说,(对 ...