ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AcWing刷题——逆序对的数量(经典逆序对)

2022-01-16 11:35:46  阅读:130  来源: 互联网

标签:mergeSort arr 数列 int mid 逆序 AcWing 刷题


题目描述

给定一个长度为 n的整数数列,请你计算数列中的逆序对的数量。

逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。

输入格式

第一行包含整数n ,表示数列的长度。

第二行包含n个整数,表示整个数列。

输出格式

输出一个整数,表示逆序对的个数。

数据范围

1 <= n <= 100000,

数列中的元素的取值范围  [1, 10^9]。

输入样例:

6
2 3 4 5 6 1

输出样例:

5

Java代码

 1 import java.util.*;
 2 
 3 public class Main {
 4     
 5     private static long res = 0;
 6     public static void main(String[] args) {
 7         Scanner input = new Scanner(System.in);
 8         int n = input.nextInt();
 9         int[] arr = new int[n];
10         for (int i = 0; i < n; i++ ) {
11             arr[i] = input.nextInt();
12         }
13         // 归并排序
14         mergeSort(0, n - 1, arr);
15         System.out.println(res);
16     }
17     
18     public static void mergeSort(int l, int r, int[] arr) {
19         if (l >= r) {
20             return;
21         }
22         int mid = (l + r) / 2;
23         mergeSort(l, mid, arr);
24         mergeSort(mid + 1, r, arr);
25         int i = l, j = mid + 1, k = 0;
26         int[] tmp = new int[r - l + 1];
27         while (i <= mid && j <= r) {
28             if (arr[i] <= arr[j]) {
29                 tmp[k++] = arr[i++];
30             } else {
31                 tmp[k++] = arr[j++];
32                 res += (mid - i + 1);
33             }
34         }
35         while (i <= mid) {
36             tmp[k++] = arr[i++];
37         }
38         while (j <= r) {
39             tmp[k++] = arr[j++];
40         }
41         // 最后将临时数组存储到arr中
42         for (int m = l, n = 0; m <= r; m++, n++) {
43             arr[m] = tmp[n];
44         }
45     }
46 }

原题链接:https://www.acwing.com/problem/content/790/

标签:mergeSort,arr,数列,int,mid,逆序,AcWing,刷题
来源: https://www.cnblogs.com/pengsay/p/15808985.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有