zoukankan      html  css  js  c++  java
  • 剑指 Offer 51. 数组中的逆序对

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

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

    解法

    暴力双循环是O(n2)的复杂度  代码简短但是耗时太长,结果TLE

    class Solution {
    public:
        int reversePairs(vector<int>& nums) {
            int ans = 0;
            for(int i = 0;i<nums.size();i++){
                for(int j = i+1;j<nums.size();j++){
                    if(nums[i] > nums[j]) ans++;
                }
            }
    
            return ans;
        }
    };

    但是可以采用归并排序得到更快速的解法。

    归并排序的计算思想自然得就蕴含一种得到逆序对的方案

    我们先来看看归并排序的过程

    在合并两个有序数组中,两个数组中的数组也是按照位置划分,如果第一个数组中的某一个数字比第二个数组的某一个数组大的话 那么这就是一个逆序对

    比如上图中的4 7 和4 8  以及 4 5 和 4 6

     

    class Solution {
    public:
    
        int merge(vector<int>& nums, int l, int r) {
            if (l >= r) return 0;
    
            int mid = l + r >> 1;
            int res = merge(nums, l, mid) + merge(nums, mid + 1, r);
    
            vector<int> temp;
            int i = l, j = mid + 1;
            while (i <= mid && j <= r)
                if (nums[i] <= nums[j]) temp.push_back(nums[i ++ ]);
                else {
                    temp.push_back(nums[j ++ ]);
                    res += mid - i + 1;
                }
            while (i <= mid) temp.push_back(nums[i ++ ]);
            while (j <= r) temp.push_back(nums[j ++ ]);
    
            int k = l;
            for (auto x : temp) nums[k ++ ] = x;
    
            return res;
        }
    
        int inversePairs(vector<int>& nums) {
            return merge(nums, 0, nums.size() - 1);
        }
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    leetcode 实现-168.Excel表列名称
    leetcode 只出现一次的数字
    leetcode 67. 二进制求和
    SQl注入测试用例
    工具使用——VMware安装及使用
    Spring基础20——AOP基础
    工具使用——IDEA常用的几种插件
    Spring基础19——Spring中几种注解的区别
    Spring基础18——通过注解配置bean之间的关联关系
    Spring基础17——使用注解来配置Bean
  • 原文地址:https://www.cnblogs.com/itdef/p/14418224.html
Copyright © 2011-2022 走看看