您的位置:首页 > 教育 > 锐评 > 太原网站优化公司_网络公司名字怎么取_网络营销公司全网推广公司_百度搜索引擎推广怎么弄

太原网站优化公司_网络公司名字怎么取_网络营销公司全网推广公司_百度搜索引擎推广怎么弄

2025/11/6 18:30:45 来源:https://blog.csdn.net/robin_suli/article/details/147151653  浏览:    关键词:太原网站优化公司_网络公司名字怎么取_网络营销公司全网推广公司_百度搜索引擎推广怎么弄
太原网站优化公司_网络公司名字怎么取_网络营销公司全网推广公司_百度搜索引擎推广怎么弄

目录

  • 题目:
  • 解析:
    • 策略一:
  • 代码:
    • 策略二:
  • 代码:

题目:

链接: 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;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com