zoukankan      html  css  js  c++  java
  • [LeetCode] 面试题51. 数组中的逆序对

    class Solution {
        public int reversePairs(int[] nums) {
            int len = nums.length;
            if(len<2){
                return 0;
            }
    
            int[] copy = new int[len];
            for(int i=0;i<len;i++){
                copy[i]=nums[i];
            }
            int[] temp=new int[len];
            return reversePairs(copy,0,len-1,temp);
        }
    
        private int reversePairs(int[] nums, int left, int right, int[] temp) {
            if (left == right) {
                return 0;
            }
    
            int mid = left + (right - left) / 2;
            int leftPairs = reversePairs(nums, left, mid, temp);
            int rightPairs = reversePairs(nums, mid + 1, right, temp);
    
            // 如果整个数组已经有序,则无需合并,注意这里使用小于等于
            if (nums[mid] <= nums[mid + 1]) {
                return leftPairs + rightPairs;
            }
    
            int crossPairs = mergeAndCount(nums, left, mid, right, temp);
            return leftPairs + rightPairs + crossPairs;
    
        }
    
        private int mergeAndCount(int[] nums, int left, int mid, int right, int[] temp) {
            for (int i = left; i <= right; i++) {
                temp[i] = nums[i];
            }
    
            int i = left;
            int j = mid + 1;
    
            int count = 0;
    
            for (int k = left; k <= right; k++) {
                // 有下标访问,得先判断是否越界
                if (i == mid + 1) {
                    nums[k] = temp[j];
                    j++;
                } else if (j == right + 1) {
                    nums[k] = temp[i];
                    i++;
                } else if (temp[i] <= temp[j]) {
                    // 注意:这里是 <= ,写成 < 就不对,请思考原因
                    nums[k] = temp[i];
                    i++;
                } else {
                    nums[k] = temp[j];
                    j++;
    
                    // 在 j 指向的元素归并回去的时候,计算逆序对的个数,只多了这一行代码
                    count += (mid - i + 1);
                }
            }
            return count;
        }
    }

    这道题也难欸

  • 相关阅读:
    【linux】驱动-13-阻塞与非阻塞
    【linux】驱动-12-并发与竞态
    【linux】驱动-11-gpio子系统
    【linux】驱动-10-pinctrl子系统
    【linux】驱动-9-设备树插件
    手写Java分页模块
    JDBC连接与自定义线程池
    类加载器
    网络编程之TCP
    网络编程之UDP
  • 原文地址:https://www.cnblogs.com/doyi111/p/12771051.html
Copyright © 2011-2022 走看看