当前位置: 首页 > news >正文

分治-归并系列一>翻转对

目录

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

题目:

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

相关文章:

  • 移动端六大语言速记:第14部分 - 数据库操作
  • 产品开发过程模型
  • 宝塔面板面试内容整理-服务重启
  • 对接日本金融市场数据全指南:K线、实时行情与IPO新股
  • myeclise导入项目并运行
  • vs中版本号如何自动生成,解放双手?
  • 低代码开发能否取代后端?深度剖析与展望-优雅草卓伊凡
  • 蓝桥杯第十五届真题——握手问题
  • 案例分析:东华新径,拉动式生产的智造之路
  • 卫星互联网技术加速发展,遨游卫星电话为生命添一份“保险”
  • 按规则批量修改文件夹名称,支持替换或删除文件夹名称中的内容
  • Java网络编程干货
  • 大模型在初治CLL成人患者诊疗全流程风险预测与方案制定中的应用研究
  • 服务器加空间失败 growpart /dev/vda 1
  • day26图像处理OpenCV
  • FFT简述及其代码多语言实现
  • Django的定制以及admin
  • 软件测试之Pytest接口自动化测试框架详解
  • MySQL 字段类型
  • 再次重拾jmeter之踩坑
  • 岳阳建设公司网站/百度推广营销页
  • 做个人网站用什么程序/营销推广计划
  • 做网站样式模板/谷歌搜索入口365
  • 宜昌 网站建设/一键制作免费网站的app
  • 品牌企业网站案例/如何做好网络营销管理
  • 河南建设工程信息网官网洛阳至信阳省道/杭州seo优化