zoukankan      html  css  js  c++  java
  • Leetcode 面试题51. 数组中的逆序对 493. 翻转对

    地址 

    https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/

    https://leetcode-cn.com/problems/reverse-pairs/

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
    
     
    
    示例 1:
    
    输入: [7,5,6,4]
    输出: 5
     
    
    限制:
    
    0 <= 数组长度 <= 50000

    这是使用归并排序计算逆序对的裸题

    class Solution {
    public:
        int tmp[50010];
        int ans =0;
        void merge_sort(vector<int>& q, int l, int r)
    {
        if (l >= r) return;
    
        int mid =( l + r) >> 1;
    
        merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
       
        int i=l; int j =mid+1;
        while(i<=mid && j<=r){
            if(q[i] > q[j]){
                ans += mid-i+1;
                j++;
            }else{
                i++;
            }
        }
            
    
        int k = 0;
        i = l, j = mid + 1;
        while (i <= mid && j <= r)
            if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
            else tmp[k ++ ] = q[j ++ ];
        while (i <= mid) tmp[k ++ ] = q[i ++ ];
        while (j <= r) tmp[k ++ ] = q[j ++ ];
    
        for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
    }
        
        int reversePairs(vector<int>& nums) {
             merge_sort(nums, 0, nums.size()-1);
           
            return ans;
        }
    };

    下一题

    给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。
    
    你需要返回给定数组中的重要翻转对的数量。
    
    示例 1:
    
    输入: [1,3,2,3,1]
    输出: 2
    示例 2:
    
    输入: [2,4,3,5,1]
    输出: 3
    注意:
    
    给定数组的长度不会超过50000。
    输入数组中的所有数字都在32位整数的表示范围内。

    同上一题一样 只不过判断从判断大小该为判断 n[i]>2*n[j]

    class Solution {
    public:
        int tmp[50010];
        int ans =0;
        void merge_sort(vector<int>& q, int l, int r)
    {
        if (l >= r) return;
    
        int mid =( l + r) >> 1;
    
        merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
       
        int i=l; int j =mid+1;
        while(i<=mid && j<=r){
            if((long long)q[i] > (long long )2*q[j]){
                ans += mid-i+1;
                j++;
            }else{
                i++;
            }
        }
            
    
        int k = 0;
        i = l, j = mid + 1;
        while (i <= mid && j <= r)
            if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
            else tmp[k ++ ] = q[j ++ ];
        while (i <= mid) tmp[k ++ ] = q[i ++ ];
        while (j <= r) tmp[k ++ ] = q[j ++ ];
    
        for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
    }
        
        int reversePairs(vector<int>& nums) {
             merge_sort(nums, 0, nums.size()-1);
           
            return ans;
        }
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    DedeCMS系统301重定向配置方法详解
    dedecms批量更新静态时提示:没有该栏目数据 可能缓存的解决方法
    修改织梦dedecms后台默认admin账号的方法
    织梦DeDeCMS动态热点文章排行调用方法
    文件与字符串处理时常见的问题(中文英文)
    基于OpenCV全景拼接(Python)SIFT/SURF
    解决关闭ssh后网页停止服务的方法,利用nohup
    解决宝塔面板没有命令行问题 && 查看宝塔面板项目环境
    python 正则表达式
    JAVAC 不是内部或外部命令
  • 原文地址:https://www.cnblogs.com/itdef/p/13095543.html
Copyright © 2011-2022 走看看