java简单实现数组中的逆序对
程序员文章站
2024-02-15 20:34:59
题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数p。并将p对1000000007取模...
题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数p。并将p对1000000007取模的结果输出。 即输出p%1000000007
解题思路:
一开始一头雾水,后面想到了使用归并排序的思想,其实有多少个逆序对,就是归并排序的时候,后面的数要超越前面多少个,嗯,好像不是很好说,要不然直接看代码吧。还要注意,题目当中说要输出取模的结果,这说明数据可能非常大,所以如果只是单纯的在最后取模的话可能还是无法避免数据太大的影响,所以我们在每次更新count的时候就对其进行取模运算。
刚好又练习了一遍归并排序,记录一下
public class solution { int count; public int inversepairs(int [] array) { count = 0; if(array != null){ divpairs(array, 0, array.length-1); } return count%1000000007; } public void divpairs(int[] array, int start, int end){ if(start >= end) return; int mid = (start + end)>>1; divpairs(array, start, mid); divpairs(array, mid+1, end); mergepairs(array, start, mid, end); } public void mergepairs(int[] array, int start, int mid, int end){ int i = start, j = mid+1, k = 0; int[] temp = new int[end-start+1]; while(i <= mid && j <= end){ if(array[i] <= array[j]){ temp[k++] = array[i++]; }else{ temp[k++] = array[j++]; count += mid - i + 1; count %= 1000000007; } } while(i <= mid){ temp[k++] = array[i++]; } while(j <= end){ temp[k++] = array[j++]; } for(int x = 0; x < temp.length; x++){ array[start+x] = temp[x]; } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: C#窗体间通讯处理的几种方法总结
下一篇: c#简单判断是否是闰年的方法代码
推荐阅读
-
java简单实现数组中的逆序对
-
[PHP] 算法-数组归并排序并计算逆序对的个数的PHP实现
-
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%100000000...
-
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。
-
ADS中C语言调用汇编语言-对C传入的数组通过汇编实现冒泡排序
-
Java中数组的排序方法的实现方式
-
Java中数组的排序方法的实现方式
-
Java中实现1到100的随机数的简单示例
-
Java实现英文句子中的单词顺序逆序输出的方法
-
Java实现对字符串中的数值进行排序操作示例