在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对,例如在数组{7,5,6,4}中,一共存在5对逆序对,分别是{7,6},{7,5},{7,4},{6,4},{5,4}。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。,即输出P%1000000007。

代码

解法一

暴力简单低效,不会改变原数组

public static int inversePairs(int[] array) {

if (array == null || array.length < 2) {

return 0;

}

int count = 0;

for (int i = 0; i < array.length; i++) {

for (int j = i + 1; j < array.length; j++) {

if (array[i] > array[j]) {

count++;

}

}

}

return count % 1000000007;

}

解法二

利用数组的归并排序,高效,但是会改变原数组

public static int inversePairs2(int[] array) {

if (array == null || array.length < 2) {

return 0;

}

int count = mergeSort(array, 0, array.length - 1);

return count % 1000000007;

}

private static int mergeSort(int[] array, int start, int end) {

if (start >= end) {

return 0;

}

// 找到数组的中点,分割为两个子数组,递归求解

int middle = (start + end) / 2;

int left = mergeSort(array, start, middle);

int right = mergeSort(array, middle + 1, end);

// 存储归并后的数组

int[] copy = new int[array.length];

System.arraycopy(array, start, copy, start, end - start + 1);

// 从两个子数组的尾部开始遍历

int i = middle;

int j = end;

int copyIndex = end;

// 记录逆序对的数量

int count = 0;

while (i >= start && j >= middle + 1) {

// 数组是升序的

// 如果左边数组比右边数组大,则将大的放入存储数组中

// 并且累加逆序对,应为是有序的,所以左边数组的第i个元素比第j个及其之前的数都大

if (array[i] > array[j]) {

copy[copyIndex--] = array[i--];

count += (j - middle);

} else {

copy[copyIndex--] = array[j--];

}

}

// 将子数组剩余的部分一次写入归并后的存储数组

while (i >= start) {

copy[copyIndex--] = array[i--];

}

while (j >= middle + 1) {

copy[copyIndex--] = array[j--];

}

// 将本次两个子数组的合并写入原数组中

for (int k = start; k <= end ; k++) {

array[k] = copy[k];

}

return left + right + count;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

倒序存放数组java_java实现数组中的逆序对相关推荐

  1. 倒序存放数组java_java 将一个数组逆序输出的方法

    java 将一个数组逆序输出的方法 题目: 将一个数组逆序输出. 代码: import java.util.*; public class lianxi31 { public static void ...

  2. android实现数组倒序,5.1.33 33.数组中的逆序对 - Android 校招面试指南

    一.题目 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 举例分析 例如在数组{7, 5, 6, 4 中, 一共存在5 个逆 ...

  3. 剑指offer:数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...

  4. C++求数组中的逆序对

    C++求数组中的逆序对. 如果在数组中的两个数字如果前面的一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数 #include<iostream> ...

  5. 【剑指offer-Java版】36数组中的逆序对

    数组中的逆序对:归并排序的另类应用 数组中的逆序对:给定的数组,如果两个数字中前面一个数字大于后面的一个,那么称为一个逆序对,数组中所有满足此关系的逆序对总数就是这个数组的逆序对 此处的实现并不优雅, ...

  6. 牛客(35)数组中的逆序对

    // 题目描述 // 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对. // 输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. ...

  7. 《剑指offer》-- 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方

    一.数组中的逆序对: 1.题目: 数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出 ...

  8. c语言数组求逆序对,LeetCode 面试题51. 数组中的逆序对

    面试题51. 数组中的逆序对 题目来源:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ 题目 在数组中的两个数字,如果 ...

  9. 剑指Offer_35_数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...

最新文章

  1. HBase保存的各个字段意义解释
  2. Windows 技巧篇-鼠标指针安装方法,漂亮的鼠标指针推荐
  3. Shiro集成SpringBoot时出现 not eligible for auto-proxying
  4. 【Python】7种方案,彻底实现可视化图片大小/分辨率控制自由
  5. 小学计算机打字基础知识,浅谈小学计算机教学技巧5篇
  6. Java内存泄露原因详解
  7. 从下往上飞入的动画效果
  8. hadoop搭建_阿里云搭建Hadoop集群
  9. 用汇编的眼光看C++(之算术符重载)
  10. 7-6 查找整数 (10 分)
  11. GX Works2快捷键
  12. 工厂如何引入ERP生产管理系统
  13. 使用MATLAB求矩阵的偏导数,求向量对变量的偏导数问题
  14. 如何加速android模拟器,Android模拟器运行慢怎么办 Android模拟器如何加速【加速方法】...
  15. vue + cesium加载krigingjs插件库生成等值线图
  16. java 鼠标动眼睛动_java实现眼睛跟着鼠标转动的跟踪眼代码
  17. uva 10537 The Toll! Revisited
  18. TexturePacker批处理python
  19. coreldraw铺花纹_CorelDRAW打造漂亮剪纸花纹教程
  20. weui实例:城市便民自行车查询

热门文章

  1. 计算机网络于20世纪60年代萌芽,计算机网络的发展经过哪几个阶段?
  2. bp神经网络隐含层神经元个数_CNN,残差网络,BP网络
  3. 不用GD32?我把STM32换成了国产MM32
  4. windows 11 预览版来了
  5. 二元函数泰勒公式例题_高等数学入门——二元函数可微性的判断方法总结
  6. android自定义图标下载,charts
  7. mysql 数组判断_mysql 判断两个数组是否有交集
  8. think php框架 跨域,ThinkPHP框架实现session跨域问题
  9. java 0x3f_Java源码位操作技巧欣赏
  10. php sodium 加密解密,sodium库(加密)