翻转对

给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对

你需要返回给定数组中的重要翻转对的数量。

示例 1:

输入: [1,3,2,3,1]

输出: 2

示例 2:

输入: [2,4,3,5,1]

输出: 3

注意:

  1. 给定数组的长度不会超过50000。
  2. 输入数组中的所有数字都在32位整数的表示范围内。
 class Solution {
public int reversePairs(int[] nums) {
//给定数组,求符合条件的逆序对
//思路:同剑指offer的类似,但是每次合并需要从头开始合并,同时排序
if(nums==null||nums.length==0) return 0;
return reversePairsCore(nums,0,nums.length-1);
}
public int reversePairsCore(int [] nums,int start,int end){
if(start>=end){
return 0;
}else{
int mid=start+(end-start)/2;
int left=reversePairsCore(nums,start,mid);
int right=reversePairsCore(nums,mid+1,end); int [] copy=new int[end-start+1];
int i=start,t=start;
int j=mid+1;
int curIndex=0;
int count=0; for(;j<=end;j++,curIndex++){
//查找满足条件的
while(i<=mid&&nums[i]<=2*(long)nums[j]){
i++;
}
//排序
while(t<=mid&&nums[t]<nums[j]){
copy[curIndex++]=nums[t++];
} //将j放入
copy[curIndex]=nums[j];
count+=mid-i+1;
} //防止还有后面大的元素
while(t<=mid){
copy[curIndex++]=nums[t++];
}
//将数组赋值给nums
System.arraycopy(copy,0,nums,start,end-start+1); return left+count+right; }
}
}

最新文章

  1. Apache Flink初接触
  2. CSS3动画(动画已丢,看原文)
  3. 多态-II(接口实现)
  4. about_并查集
  5. nginx 多站点配置方法集合(转)
  6. 通过javascript完成分页查询功能
  7. Qt之启动外部程序
  8. python环境准备
  9. NHibernate -- HQL
  10. (转)JVM类生命周期概述:加载时机与加载过程
  11. SVN服务迁移备份操作步骤
  12. openstack Keystone验证服务集群
  13. Idea 的两个快捷键不能用的解决过程
  14. C# 实现 Snowflake算法生成唯一性Id
  15. python学习笔记:装饰器2
  16. Android动态控制状态栏显示和隐藏
  17. Gephi可视化(二)
  18. AD原理图统一命名
  19. QEMU,KVM及QEMU-KVM介绍
  20. node系列:全局与本地

热门文章

  1. CSS样式中visited,hover,active , focus这四个分别表示什么意思?
  2. git入门使用摘录
  3. clearerr, feof, ferror, fileno - 检查以及重置流状态
  4. 如何在python中读写和存储matlab的数据文件(*.mat)
  5. CURLOPT_PROGRESSFUNCTION
  6. pymysql模块操作数据库及连接报错解决方法
  7. Bank Simulation Program银行管理系统C++ :)
  8. java一些问题的解答
  9. Python学习笔记(五)之Python操作Redis、mysql、mongodb数据库
  10. 理解 Objective-c &quot;属性&quot;