• 剑指offer 35.数组中的逆序对


    剑指offer 35.数组中的逆序对

    题目

    题目描述
    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007

    输入描述:
    题目保证输入的数组中没有的相同的数字

    数据范围:

    对于%50的数据,size<=10^4
    对于%75的数据,size<=10^5
    对于%100的数据,size<=2*10^5

    思路

    这题好麻烦的,最后选择了模拟归并排序的方法,分成最小的块然后进行归并,归并时内部的逆序对就已经计算了,不需要再计算一次。
    以158,236为例子,首先1<2,逆序不用计算,然后5>3,应该放3,逆序增加5,8两个数字,为mid-l+1,行了。

    代码

      long count = 0;
    
      public void merge(int[] array, int[] copy, int start, int end) {
        if (start >= end) {
          return;
        }
    
        int mid = (end - start) / 2 + start;
        merge(array, copy, start, mid);
        merge(array, copy, mid + 1, end);
        int l = start;
        int r = mid + 1;
        int temp = start;
        while (l <= mid && r <= end) {
          if (array[l] <= array[r]) {
            copy[temp++] = array[l++];
          } else {
            count += mid - l + 1;
            copy[temp++] = array[r++];
            if (count > 1000000007) {
              count %=  1000000007;
            }
          }
        }
        while (l <= mid) {
          copy[temp++] = array[l++];
        }
        while (r <= end) {
          copy[temp++] = array[r++];
        }
        for (int i = start; i <= end; i++) {
          array[i] = copy[i];
        }
      }
    
      public int InversePairs(int[] array) {
        int start = 0;
        int end = array.length - 1;
        int[] copy = new int[array.length];
        merge(array, copy, start, end);
        return (int) count;
      }
    
  • 相关阅读:
    对类型化数组的理解
    vue中$bus的传参的坑
    在dva框架和create-react-app创建出来的框架中修饰器语法与按需加载引入antd分别配置
    dva与create-react-app的结合使用
    网络请求之jsonp封装
    js中的超过16位数字相加问题
    dva框架简单描述使用
    后台管理系统之图片上传功能
    剪贴板功能的实现
    前后端登录注册之node剖析与token的使用状态
  • 原文地址:https://www.cnblogs.com/blogxjc/p/12411407.html
Copyright © 2020-2023  润新知