DESC:

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

示例 1:

输入: [7,5,6,4]
输出: 5

限制:

0 <= 数组长度 <= 50000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

CODE:

JAVA:

class Solution {public int reversePairs(int[] nums) {if (nums == null || nums.length < 2) {return 0;}int[] tempArr = new int[nums.length];return reversePairs(nums, 0, nums.length-1, tempArr);}public int reversePairs(int[] nums, int left, int right, int[] tempArr) {//递归结束条件if (left == right) {return 0;}//copy对应区间到临时数组,后面后更改原数组对应区间序列为有序for (int i=left; i<=right; i++) {tempArr[i] = nums[i];}//分治,求左半区域,右半区域的逆序数//注意:[left,right]区域逆序数N=N[left,mid]+N[mid+1,right]+left相对right的CrossrossN(这部分认真想想)int mid = left + (right-left)/2;int leftCount = reversePairs(nums, left, mid, tempArr);//执行后变为有序数组int rightCount = reversePairs(nums, mid+1, right, tempArr);//执行后变为有序数组//特殊情况,右半边均大于等于左半边,所以左半边和右半边就组成不了逆序对了,为0if (nums[mid] <= nums[mid+1]) {return leftCount + rightCount;}//归并计算交叉区域的逆序数(此时左右数组均已有序)int crossCount = crossMerge(nums, left, mid, right, tempArr);return leftCount + rightCount + crossCount;}public int crossMerge(int[] nums, int left, int mid, int right, int[] tempArr) {for (int i=left; i<=right; i++) {tempArr[i] = nums[i];}int i = left, j = mid+1, count = 0;for (int k=left; k<= right; k++) {if (i == mid+1) {nums[k] = tempArr[j];j++;} else if (j == right+1) {nums[k] = tempArr[i];i++;} else if (tempArr[i] <= tempArr[j]) {//注意是<=,不是<,可以看数组想想nums[k] = tempArr[i];i++;} else {nums[k] = tempArr[j];j++;count += (mid - i + 1);}}return count;}
}

PYTHON:

class Solution:def reversePairs(self, nums: List[int]) -> int:if nums is None or len(nums)<2:return 0tempArr = [0] * len(nums)return self.reverse_pairs(nums, 0, len(nums)-1, tempArr)def reverse_pairs(self, nums, left, right, tempArr):if left == right:return 0mid = left + (right-left)//2left_count = self.reverse_pairs(nums, left, mid, tempArr)right_count = self.reverse_pairs(nums, mid+1, right, tempArr)if nums[mid] <= nums[mid+1]:return left_count + right_countcross_count = self.cross_pairs(nums, left, mid, right, tempArr)return left_count + right_count + cross_countdef cross_pairs(self, nums, left, mid, right, tempArr):for k in range(left, right+1):tempArr[k] = nums[k]i=leftj=mid+1count=0for k in range(left, right+1):if i == mid+1:nums[k] = tempArr[j]j+=1elif j == right+1:nums[k] = tempArr[i]i+=1elif tempArr[i] <= tempArr[j]:nums[k] = tempArr[i]i+=1else:nums[k] = tempArr[j]j+=1count += (mid - i + 1)return count

LEETCODE耗时:

NOTES:

1. 归并排序(自底向上求左右有序数组交叉逆序数)
2. 原数组逆序数=左半区域逆序数+右半区域逆序数+左右区域交叉逆序数(通过归并有序数组计算)
3. mid=left+(right-left)/2
4. [left, right], 右闭 right=length-1

求数组中逆序对的个数相关推荐

  1. JavaScript求数组中每个元素的个数,如数组str = [1,2,3,2,4,1,2]中元素2的个数为2。要求:使用对象知识来实现,输出结果为对象,对象包含数组元素和个数值。

    求数组中每个元素的个数,如数组str = [1,2,3,2,4,1,2]中元素2的个数为2. 要求:使用对象知识来实现,输出结果为对象,对象包含数组元素和个数值. <script>var ...

  2. c语言统计字符数组上字母和数字,C语言问题求数组中的字母数字字符个数 – 手机爱问...

    编个程序要求满足以下功能将字符串数组中每一行中的大写字母A.B.C都换成数字2,并且去除字符串中的连字符号'-',但是数字保持不变.设字符串数组有3行.例如:字符串内容为:输出的内容为A-BC-CBC ...

  3. 求数组中各个元素的个数?

    1 //声明数组 2 char[] chars = {'A', 'B', 'C', 'A', 'A', 'B'}; 3 4 //声明字典,如果chars数组是int类型的, 5 //则相应的colle ...

  4. 求数组中奇数偶数的个数

    public static void main(String[] args) {// TODO Auto-generated method stubint a[]={1,2,3,4,5,6,7,8,9 ...

  5. 计算数组的逆序对个数

    问题:给定一个数组A,A存有n个互不相同的整数.定义:若i<j且A[i]>A[j],则称(i,j)为A的一个逆序对(inversation).设计一个O(nlogn)算法求A中逆序对个数. ...

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

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

  7. 13.在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。(左神算法基础班源码)

    package basic_class_01; /*** *小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和.求一个数组的小和.例子:[1,3,4,2,5]1左边比1小的数 ...

  8. 求数组中k个数的所有组合

    /*** 求数组中 k个元素序列 的所有组合* @param start* @param array* @param length* @param k* @param list* @param use ...

  9. java求数组中满足给定和的数对_关于数组的几道面试题 - zdd - 博客园

    2011年2月15日更新,加入找出绝对值最小的元素一题 数组是最基本的数据结构,关于数组的面试题也屡见不鲜,本文罗列了一些常见的面试题,仅供参考,如果您有更好的题目或者想法,欢迎留言讨论.目前有以下1 ...

最新文章

  1. 查找内存泄漏的一个思路
  2. Java线程池Executor框架
  3. Docker制作dotnet core控制台程序镜像
  4. 关于数据库更新插入语句
  5. 报错 The CUDA compiler identification is unknown;No CMAKE_CUDA_COMPILER could be found.
  6. CCF NOI1038 玩扑克
  7. 【openGauss 1.1.0测试:全量备份和恢复增量备份和恢复】
  8. .net npoi 导出合并单元格
  9. 决策树及matlab实现
  10. Android音频剪辑裁剪自定义view
  11. linux 硬盘品牌,CentOS如何查看硬盘品牌型号等具体信息
  12. linux企鹅吉祥物的名字,让我来告诉你Linux为何选吉祥物是企鹅
  13. tekton task资源
  14. UPC——2020年春混合个人训练第二十五场(FG)
  15. 华为、阿里等知名公司年终奖发了多少?
  16. 【SSH连接服务器老是断】client_loop: send disconnect: Broken pipe
  17. iOS APP 瘦身实战
  18. ajax中xAxis的赋值
  19. greensock下载_GreenSock MorphSVGPlugin
  20. 三相可控全桥整流与DC Buck变换电路设计仿真问题汇总

热门文章

  1. linux验证文件的完整性,Linux系统中校验下载文件的完整性方法(MD5,SHA1,PGP)
  2. C语言while循环标准格式
  3. easyui---使用教程
  4. 会说话,少奋斗30年
  5. java tess4j训练库,包括Tess4J到Java项目作为在Eclipse库
  6. 什么是类?什么是对象?类和对象有什么关系?
  7. mac bios设置
  8. Delphi Project 之工程管理器(Project Manager)
  9. 回归基础:各种排序算法详解
  10. Git 常用命令速查表(收藏大全)