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驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    Linux监控内核SNMP计数器
    wireshark使用手册
    【LinuxShell】echo用法详解
    【Coredump】调试之旅
    汇编指令
    从零开始学Java (五)条件选择
    从零开始学Java (四)输入输出
    Dart基础
    树相关
    递归简介
  • 原文地址:https://www.cnblogs.com/itdef/p/13095543.html
Copyright © 2011-2022 走看看