倒序存放数组java_java实现数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对,例如在数组{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实现数组中的逆序对相关推荐
- 倒序存放数组java_java 将一个数组逆序输出的方法
java 将一个数组逆序输出的方法 题目: 将一个数组逆序输出. 代码: import java.util.*; public class lianxi31 { public static void ...
- android实现数组倒序,5.1.33 33.数组中的逆序对 - Android 校招面试指南
一.题目 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 举例分析 例如在数组{7, 5, 6, 4 中, 一共存在5 个逆 ...
- 剑指offer:数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- C++求数组中的逆序对
C++求数组中的逆序对. 如果在数组中的两个数字如果前面的一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数 #include<iostream> ...
- 【剑指offer-Java版】36数组中的逆序对
数组中的逆序对:归并排序的另类应用 数组中的逆序对:给定的数组,如果两个数字中前面一个数字大于后面的一个,那么称为一个逆序对,数组中所有满足此关系的逆序对总数就是这个数组的逆序对 此处的实现并不优雅, ...
- 牛客(35)数组中的逆序对
// 题目描述 // 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对. // 输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. ...
- 《剑指offer》-- 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方
一.数组中的逆序对: 1.题目: 数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出 ...
- c语言数组求逆序对,LeetCode 面试题51. 数组中的逆序对
面试题51. 数组中的逆序对 题目来源:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/ 题目 在数组中的两个数字,如果 ...
- 剑指Offer_35_数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
最新文章
- HBase保存的各个字段意义解释
- Windows 技巧篇-鼠标指针安装方法,漂亮的鼠标指针推荐
- Shiro集成SpringBoot时出现 not eligible for auto-proxying
- 【Python】7种方案,彻底实现可视化图片大小/分辨率控制自由
- 小学计算机打字基础知识,浅谈小学计算机教学技巧5篇
- Java内存泄露原因详解
- 从下往上飞入的动画效果
- hadoop搭建_阿里云搭建Hadoop集群
- 用汇编的眼光看C++(之算术符重载)
- 7-6 查找整数 (10 分)
- GX Works2快捷键
- 工厂如何引入ERP生产管理系统
- 使用MATLAB求矩阵的偏导数,求向量对变量的偏导数问题
- 如何加速android模拟器,Android模拟器运行慢怎么办 Android模拟器如何加速【加速方法】...
- vue + cesium加载krigingjs插件库生成等值线图
- java 鼠标动眼睛动_java实现眼睛跟着鼠标转动的跟踪眼代码
- uva 10537 The Toll! Revisited
- TexturePacker批处理python
- coreldraw铺花纹_CorelDRAW打造漂亮剪纸花纹教程
- weui实例:城市便民自行车查询
热门文章
- 计算机网络于20世纪60年代萌芽,计算机网络的发展经过哪几个阶段?
- bp神经网络隐含层神经元个数_CNN,残差网络,BP网络
- 不用GD32?我把STM32换成了国产MM32
- windows 11 预览版来了
- 二元函数泰勒公式例题_高等数学入门——二元函数可微性的判断方法总结
- android自定义图标下载,charts
- mysql 数组判断_mysql 判断两个数组是否有交集
- think php框架 跨域,ThinkPHP框架实现session跨域问题
- java 0x3f_Java源码位操作技巧欣赏
- php sodium 加密解密,sodium库(加密)