目录
- 题目:
- 解析:
- 策略一:
- 代码:
- 策略二:
- 代码:
题目:
链接: link
这题和逆序对区别点就是,要找到前一个元素是后一个元素的2倍
先找到目标值再,继续堆排序
解析:
策略一:
代码:
class Solution {
int[] tmp;
public int reversePairs(int[] nums) {
int n = nums.length;
tmp = new int[n];
return mergesort(nums,0,n-1);
}
private int mergesort(int[] nums, int left, int right){
int ret = 0;
if(left >= right) return 0;
int mid = (right + left) / 2;
//左右两边找翻转对
ret += mergesort(nums,left,mid);
ret += mergesort(nums,mid+1,right);
//一左一右找翻转对: 降序版本
//输入数组中的所有数字都在32位整数的表示范围内:改为:2.0*nums[cur2]
int cur1 = left, cur2 = mid+1, i = 0;
while(cur1 <= mid && cur2 <= right){
if(nums[cur1] <= 2.0*nums[cur2]){
cur2++;
}else {
ret += right - cur2 + 1;
cur1++;
}
if(cur2 > right) break;
}
//排序:
cur1 = left; cur2 = mid+1;
while(cur1 <= mid && cur2 <= right)
tmp[i++] = nums[cur1] <= nums[cur2]? nums[cur2++] : nums[cur1++];
while(cur1 <= mid) tmp[i++] = nums[cur1++];
while(cur2 <= right) tmp[i++] = nums[cur2++];
//放回原数组:
for(int j = left; j <= right; j++){
nums[j] = tmp[j-left];
}
return ret;
}
}
策略二:
代码:
class Solution {
int[] tmp;
public int reversePairs(int[] nums) {
int n = nums.length;
tmp = new int[n];
return mergesort(nums,0,n-1);
}
一左一右找翻转对: 升序版本:
private int mergesort(int[] nums, int left, int right){
int ret = 0;
if(left >= right) return 0;
int mid = (right + left) / 2;
//左右两边找翻转对
ret += mergesort(nums,left,mid);
ret += mergesort(nums,mid+1,right);
//一左一右找翻转对: 升序版本
//输入数组中的所有数字都在32位整数的表示范围内:改为:2.0*nums[cur2]
int cur1 = left, cur2 = mid+1, i = 0;
while(cur1 <= mid && cur2 <= right){
if(nums[cur1] / 2.0 <= nums[cur2]){
cur1++;
}else {
ret += mid - cur1 + 1;
cur2++;
}
if(cur1 > mid) break;
}
//排序:
cur1 = left; cur2 = mid+1;
while(cur1 <= mid && cur2 <= right)
tmp[i++] = nums[cur1] <= nums[cur2]? nums[cur1++] : nums[cur2++];
while(cur1 <= mid) tmp[i++] = nums[cur1++];
while(cur2 <= right) tmp[i++] = nums[cur2++];
//放回原数组:
for(int j = left; j <= right; j++){
nums[j] = tmp[j-left];
}
return ret;
}
}








![P8627 [蓝桥杯 2015 省 A] 饮料换购](https://i-blog.csdnimg.cn/direct/fe760a4d787d4daca987288d03d2195b.png)


![[UEC++]UE5C++各类变量相关知识及其API(更新中)](https://i-blog.csdnimg.cn/direct/1fa6e22e30d84dc1858c57232c0e09a1.png)


![[Effective C++]条款30:透彻了解inlining的里里外外](https://i-blog.csdnimg.cn/direct/e4d3cbd3f39e4e719044cb86b2409cf7.png)







