数据结构算法(数组翻转对)
程序员文章站
2022-06-18 16:06:10
493. 翻转对难度困难118给定一个数组 nums ,如果 i < j 且 nums[i] > 2nums[j] 我们就将 (i, j) 称作一个重要翻转对*。你需要返回给定数组中的重要翻转对的数量。示例 1:输入: [1,3,2,3,1]输出: 2示例 2:输入: [2,4,3,5,1]输出: 3 //归并排序中进行统计 public int reversePairs(int[] nums) { if(nums =...
493. 翻转对
难度困难118
给定一个数组 nums ,如果 i < j 且 nums[i] > 2nums[j] 我们就将 (i, j) 称作一个重要翻转对*。
你需要返回给定数组中的重要翻转对的数量。
示例 1:
输入: [1,3,2,3,1] 输出: 2
示例 2:
输入: [2,4,3,5,1] 输出: 3
//归并排序中进行统计 public int reversePairs(int[] nums) { if(nums == null || nums.length == 0) 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)/2; int count = mergeSort(nums,l,mid)+mergeSort(nums,mid+1,r); int [] cache = new int [r-l+1]; int i = l,t = l, c = 0; for(int j = mid+1;j<=r;j++,c++){ while(i<=mid && nums[i]<=2*(long)nums[j]) i++; while(t<=mid && nums[t]<=nums[j]) cache[c++] = nums[t++]; cache[c] = nums[j]; count+= mid-i+1; } while(t<=mid) cache[c++] =nums[t++]; System.arraycopy(cache,0,nums,l,r-l+1); return count; }
本文地址:https://blog.csdn.net/jia970426/article/details/107920638
推荐阅读
-
java数据结构和算法——数组模拟队列(queue)
-
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
-
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
-
数据结构算法,构建乘积数组
-
Python cookbook(数据结构与算法)对切片命名清除索引的方法
-
重读《学习JavaScript数据结构与算法-第三版》- 第3章 数组(二)
-
java数据结构和算法——数组模拟环形队列(queue)
-
数据结构算法(数组中的逆序对)
-
数据结构算法(数组中出现次数超过一半的数字)
-
数据结构与算法的JavaScript描述之对列(代码实例)