博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Leetcode刷题篇】剑指offer51 数组中的逆序对
阅读量:1885 次
发布时间:2019-04-26

本文共 2351 字,大约阅读时间需要 7 分钟。

在解决该问题之前,先来看一下归并排序。

// 归并排序	public static void mergeSort(int[] arr) {
if(arr==null || arr.length<2) {
return; } sortProcess(arr,0,arr.length-1); } public static void sortProcess(int[] arr,int L,int R) {
if(L==R) {
return; } int mid = L + ((R-L) >> 1); sortProcess(arr, L, mid); sortProcess(arr, mid+1, R); merge(arr,L,mid,R); } public static void merge(int[] arr,int L,int mid,int R) {
int[] temp = new int[R-L+1]; int i = 0; int p1 = L; int p2 = mid + 1; while(p1<=mid&&p2<=R) {
temp[i++] = arr[p1]

此题 与小数和问题类似

小和问题
在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组
的小和。
例子:
[1,3,4,2,5]
1左边比1小的数,没有;
3左边比3小的数,1;
4左边比4小的数,1、3;
2左边比2小的数,1;
5左边比5小的数,1、3、4、2;
所以小和为1+1+3+1+1+3+4+2=16

public static int smallSum(int[] arr) {
if(arr==null||arr.length<2) {
return 0; } return mergeSort_2(arr,0,arr.length-1); } public static int mergeSort_2(int[] arr,int L,int R) {
// 终止条件 if(L==R) {
return 0; } int mid = L + ((R-L)>>1); return mergeSort_2(arr,L,mid) + mergeSort_2(arr,mid+1,R)+merge_2(arr,L,mid,R); } public static int merge_2(int[] arr,int L,int mid,int R) {
int[] temp = new int[R-L+1]; int i = 0; int p1 = L; int p2 = mid+1; int res = 0; while(p1<=mid&&p2<=R) {
res += arr[p1]

而本题在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

package com.lcz.leetcode;/** * 数组中的逆序对 * @author LvChaoZhang * */public class Leetcode_offer51 {
class Solution{
public int reversePairs(int[] nums) {
if(nums==null||nums.length<2) {
return 0; } return mergeSort(nums,0,nums.length-1); } public int mergeSort(int[] nums,int L,int R) {
// 终止条件 if(L==R) {
return 0; } int mid = L + ((R-L)>>1); int leftPairs = mergeSort(nums, L, mid); int rightPairs = mergeSort(nums, mid+1, R); if(nums[mid]<=nums[mid+1]) {
return leftPairs+rightPairs; } int crossPairs = merge(nums,L,mid,R); return leftPairs+rightPairs+crossPairs; } public int merge(int[] arr,int L,int mid,int R) {
int[] temp = new int[R-L+1]; int res = 0; int i = 0; int p1 = L; int p2 = mid+1; while(p1<=mid&&p2<=R) {
res += arr[p1]>arr[p2]?(mid-p1+1):0; temp[i++] = arr[p1]<=arr[p2]?arr[p1++]:arr[p2++]; } while(p1<=mid) {
temp[i++] = arr[p1++]; } while(p2<=R) {
temp[i++] = arr[p2++]; } for(i=0;i

转载地址:http://tzwdf.baihongyu.com/

你可能感兴趣的文章
Git与Repo入门
查看>>
整洁代码之道——重构
查看>>
重构代码的7个阶段
查看>>
如何重构“箭头型”代码
查看>>
最实用的10个重构小技巧排行榜,您都用过哪些呢?
查看>>
第三部分:Idea重构总结
查看>>
HTML 事件属性
查看>>
HTML 5 视频/音频参考手册
查看>>
HTTP 状态码
查看>>
HTTP 方法:GET 对比 POST
查看>>
Tomcat-简易使用教程
查看>>
Tomcat学习总结(1)——Tomcat入门教程
查看>>
Tomcat7目录结构详解(非常详细)
查看>>
Tomcat——目录结构
查看>>
tomcat文件目录结构及功能介绍
查看>>
Tomcat学习总结(2)——Tomcat使用详解
查看>>
Apache与Tomcat 区别联系
查看>>
面向初级 Web 开发人员的 Tomcat
查看>>
Spring Validation(使用Hibernate Validator)
查看>>
阿里巴巴代码规范-note
查看>>