剑指offer_数组中的逆序对
题目描述
public class Solution36 {
private int count = 0; //记录次数
private int[] copy ;
public int InversePairs(int [] array) {
if(array.length == 0) return 0;
copy = new int[array.length];
sort(array, 0, array.length-1);
return count%1000000007;
}
private void sort(int[] array, int start, int end) {
if(end <= start) return;
//int mid = start + (end - start) / 2;
int mid = (end+start) /2;
sort(array, start, mid);//左边数组排序
sort(array, mid + 1, end);//右边数组排序
merge(array,start,mid, end); //归并方法
}
/**
* 排序
* @param array 需要排序的数组
* @param start 数组的起始位置
* @param mid 数组的中间位置
* @param end
*/
private void merge(int[] array, int start, int mid, int end) {
int i = start, j = mid + 1; //将数组分割成两段,由于归并排序特点,前后两段是有序的
for(int k = start; k <= end; k++){ //复制数组
copy[k] = array[k];
}
for(int k= start; k<= end; k++){
if(i > mid) array[k] = copy[j++]; //当只剩下右边数组
else if(j > end) array[k] = copy[i++]; //当只剩下左边数组
else if(copy[i] > copy[j]) {//当前一个数组的数大于后一个数组的数时,逆序(前后数组分界点为mid)
/**
* 例如数组5 6 7 2 4 8进行归并 ,因为归并排序会使数组前后数组有序
* 前一个数组为:5 6 7 ,后一个数组为: 2 4 8
* 当 5 大于 2时,5后面的6,7都会大于2, 且5的最后一个数组下标为mid,
* 所以count = count+ mid - i + 1 然后将2添加到array[k]中
*/
count = (count + mid-i + 1)%1000000007;
array[k] = copy[j++];
}else {
array[k] = copy[i++];
}
}
}
}
测试代码:
1 public static void main(String[] args){
Solution36 solution36 = new Solution36();
int[] array = new int[]{3,3,2,4,2,1};
int count = solution36.InversePairs(array);
System.out.println(count);
for (Integer i: array) {
System.out.print(i + " ");
}
}
剑指offer_数组中的逆序对的更多相关文章
- [剑指OFFER] 数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 分析:利用归并排序的思想,分成2部分,每一部分按照从大到 ...
- 剑指Offer——数组中的逆序对
题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%100 ...
- 剑指Offer-34.数组中的逆序对(C++/Java)
题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%10000 ...
- 用js刷剑指offer(数组中的逆序对)
题目描述 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P ...
- 剑指Offer——数组中的逆序对(归并排序的应用)
蛮力: 遍历数组,对每个元素都往前遍历所有元素,如果有发现比它小的元素,就count++. 最后返回count取模. 结果没问题,但超时哈哈哈,只能过50%. 归并法: 看讨论,知道了这道题的经典 ...
- 剑指 Offer——数组中的逆序对
1. 题目 2. 解答 借助于归并排序的分治思想,在每次合并的时候统计逆序对.因为要合并的两个数组都是有序的,如果左半部分数组当前值大于右半部分数组当前值,那么左半部分数组当前值右边的数就都大于右半部 ...
- 剑指Offer34 数组中的逆序对
/************************************************************************* > File Name: 34_Invers ...
- 剑指offer-数组中的逆序对-数组-python
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- 剑指offer(35)数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
随机推荐
- jQuery内容过滤器
jQuery内容过滤器 <h1>this is h1</h1> <div id="p1"> <h2>this is h2</h ...
- C# App.config配置文件的讲解
App.config是C#开发WinForm程序的配置文件,开发Web程序的配置文件叫Web.config.本文介绍App.config的简介使用. 我们先来打开一个App.config文件,看看它的 ...
- MalformedObjectNameException: Invalid character '' in value part of property
http://blog.csdn.net/getdate/article/details/6729706 ojdbc6.jar的问题: 最近在项目中用spring配置oracle数据库连接池, 启动的 ...
- HttpServletRequest和ServletRequest的区别
servlet理论上可以处理多种形式的请求响应形式,http只是其中之一所以HttpServletRequest HttpServletResponse分别是ServletRequest和Servle ...
- 关于Vue.js 使用v-cloak后仍显示变量的解决方法
v-cloak 这个指令是防止页面加载时出现 vuejs 的变量名而设计的,但有时候添加了这个指令仍会显示变量,这是怎么回事呢?. v-cloak 用法: HTML代码: <div v-cl ...
- css,html性能优化
css性能优化 CSS是负责布局和渲染的重要角色,漂亮的页面当然能够吸引用户.本文是自己在开发过程中总结的关于CSS与性能的关系,可能有不对之处,希望能够指出. ? 1.所有的样式尽量放在css文件中 ...
- Oracle 11g 的安装及配置详解
一.安装前的准备: 首先在这里给出本人的百度网盘的链接:http://pan.baidu.com/s/1c1WF1PQ:网速快的小伙伴建议到官网:http://www.oracle.com/techn ...
- 在C++中反射调用.NET(三)
在.NET与C++之间传输集合数据 上一篇<在C++中反射调用.NET(二)>中,我们尝试了反射调用一个返回DTO对象的.NET方法,今天来看看如何在.NET与C++之间传输集合数据. 使 ...
- Xshell利用登录脚本从服务器登录到另外一个服务器
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- 使用python制作ArcGIS插件(4)界面交互
使用python制作ArcGIS插件(4)界面交互 by 李远祥 插件界面部分,除了一开始在设计器中设计的这些界面元素之外,还可以与操作系统进行一些输入输出的交互,这部分的实现全部在pythonadd ...