剑指 Offer 51. 数组中的逆序对

这篇具有很好参考价值的文章主要介绍了剑指 Offer 51. 数组中的逆序对。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

剑指 Offer 51. 数组中的逆序对

 

剑指 Offer 51. 数组中的逆序对

【归并】朴实无华的一个归并排序的应用,对于一个数组,我们通过归并排序来从大到小进行排序,在合并的过程中如果前面区间有比后面区间大的元素,那么后面区间从这个元素开始一直到结束都能和前面区间的那个数组成逆序对。

举个🌰:

7,5,6,4,3

我们知道归并排序是先划分然后再合并,最底层的肯定就是单个元素,所以一开始的时候:(啊不对,还是算一算区间划分吧,第一层[0, 2] [3, 4], 第二层[0, 1] [2] [3] [4], 第一个划分第三层)

第三层:[7], [5]

归并的时候我们发现7 > 5,说明组成了一个逆序对。合并后是[7, 5];

第二层:先合并[7, 5], [6] 再合并 [4], [3];

7 > 6, 增加一个逆序对;合并为[7, 6, 5];

4 > 3, 增加一个逆序对;合并为[4, 3]。

第一层合并[7, 6, 5]和[4, 3]

7 > 4,增加两个逆序对,注意这里是两个,因为4后面肯定比4还小,另外此时7已经归并到最终数组去了;

6 > 4,再增加两个逆序对;

5 > 4,再增加两个逆序对。

所以总结下来,这个的精髓就是在归并A,B区间的过程中,如果发现A区间的元素a>B区间的元素b,那么B区间从b开始剩下的元素肯定能和a组成逆序对(在归并过程中a和b都是现存的区间的最顶元素了)。文章来源地址https://www.toymoban.com/news/detail-430406.html

class Solution {

    // 归并 4:38 5

    int ans = 0, n;
    int[] nums, tmp; 

    void mergeSort(int l, int r){
        if(l >= r) return;
        int mid = (l + r) >>> 1;
        mergeSort(l, mid); mergeSort(mid + 1, r);
        int i = l, j = mid + 1, k = 0;
        while(i <= mid && j <= r){
            if(nums[i] > nums[j]){
                ans += (r - j + 1);
                tmp[k++] = nums[i++];
            }else{
                tmp[k++] = nums[j++];
            }
        }
        while(i <= mid) tmp[k++] = nums[i++];
        while(j <= r) tmp[k++] = nums[j++];
        for(i = l, j = 0; j < k; i++, j++) nums[i] = tmp[j];
    }

    public int reversePairs(int[] nums) {
        n = nums.length;
        this.nums = nums;
        tmp = new int[n];
        mergeSort(0, n - 1);
        return ans;
    }
}

到了这里,关于剑指 Offer 51. 数组中的逆序对的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【剑指offer】数据结构——数组

    【剑指offer】03.数组中重复的数字 //03. 数组中重复的数字 // 找出数组中重复的数字。 // 力扣 // 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。 // 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每 // 个数字重复了几次。请找出数组中任意一

    2024年02月08日
    浏览(31)
  • 剑指 Offer —— 数组和字符串

    在一个 n * m 的二维数组中: 每一行都按照从左到右 非递减 的顺序排序 每一列都按照从上到下 非递减 的顺序排序 请完成一个高效的函数,输入这样的一个 二维数组和一个整数 ,判断 数组中是否含有该整数 。 示例: 现有矩阵 matrix 如下: 给定 target = 5 ,返回 true 。 给定

    2023年04月24日
    浏览(35)
  • 【剑指 offer】旋转数组的最小数字

    ✨个人主页:bit me👇 ✨当前专栏:算法训练营👇 核心考点:数组理解,二分查找,临界条件 描述: 有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这

    2023年04月20日
    浏览(43)
  • 剑指 Offer 66. 构建乘积数组(中等)

    题目: 作者:Krahets 链接:https://leetcode.cn/problems/gou-jian-cheng-ji-shu-zu-lcof/solutions/208840/mian-shi-ti-66-gou-jian-cheng-ji-shu-zu-biao-ge-fe/ 来源:力扣(LeetCode)

    2024年02月10日
    浏览(26)
  • 【剑指offer】数组中重复的数字

    👑专栏内容:力扣刷题 ⛪个人主页:子夜的星的主页 💕座右铭:前路未远,步履不停 剑指offer:数组中重复的数字 在一个长度为 n 的数组里的所有数字都在 0 0 0 到 n − 1 n-1 n − 1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复,也不知道每个数字重复了几

    2024年01月20日
    浏览(35)
  • 【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组

    🌈个人主页: 聆风吟 🔥系列专栏: 数据结构、剑指offer每日一练 🔖少年有梦不应止于心动,更要付诸行动。 ⌈ 在线OJ链接,可以转至此处自行练习 ⌋ 设备中存有 n 个文件,文件 id 记于数组 documents 。若文件 id 相同,则定义为该文件存在副本。请返回任一存在副本的文件

    2024年02月05日
    浏览(30)
  • 剑指offer03.数组中重复的数字

    看到这道题的第一眼想到的是先给它排序,然后双指针从左往右遍历,写了一个冒泡排序,但是我想到了应该会超时,因为冒泡时间复杂度是n的平方,输入大小时10000,肯定会超时,然后右又看了一下题目看到数字都是0-n-1,灵感一下子就来了,我先创建一个等大的自然数数

    2024年02月11日
    浏览(29)
  • 剑指offer练习日志01--数组小练习

    目录 ​ 一.剑指 Offer 03. 数组中重复的数字(原地哈希思想) 问题描述: 问题分析: 原地哈希思想排序: 题解算法gif:  算法接口: 二.二维数组中的查找(😍行列交叉二分法😍) 问题描述: 方法一:🤔对角元素比较搜索法🤔 算法思想: 算法gif:  算法接口实现: 方法二.😍行列交叉二

    2023年04月24日
    浏览(27)
  • 【剑指offer|1.数组中重复的数字】

    : 长度为n的数组nums中所有数字都在0~n-1范围内 返回任意一个重复的数字 总体时间复杂度和空间复杂度分析: 修改数组的方法: 因为有n个元素,每一个元素都在0~(n-1)范围内,如果元素不重复的话, 对数组重排之后,下标和元素值之间应该是一一对应的关系 但是因为

    2023年04月22日
    浏览(30)
  • 剑指 Offer 03. 数组中重复的数字

    剑指 Offer 03. 数组中重复的数字 利用题目的限制条件: 所有数字都在 0~n-1 的范围内 通过交互让数字和下标一一对应,如果有多个数字对应同一个下标,那就找到了答案。 另一种写法

    2024年02月11日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包