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

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

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

    问题描述:

    在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

    示例 1:

    输入: [7,5,6,4]
    输出: 5

    限制:

    0 <= 数组长度 <= 50000

    object Solution {
        val tmp = new Array[Int](50005)
    
        def reversePairs(nums: Array[Int]): Int = {
            return mergeSort(nums, 0, nums.length-1).toInt
        }
    
        def mergeSort(nums: Array[Int], left: Int, right: Int): Long = {
            if (left >= right) {return 0}
            val mid = (left + right) >> 1
            var res: Long = mergeSort(nums, left, mid) + mergeSort(nums, mid+1, right)
    
            var k = 0
            var i = left
            var j = mid + 1
            while (i <= mid && j <= right) {
                if (nums(i) <= nums(j)) {
                    tmp(k) = nums(i)
                    k += 1
                    i += 1
                } else {
                    tmp(k) = nums(j)
                    res = res + mid - i + 1
                    k += 1
                    j += 1 
                }
            }
    
            while (i <= mid) {
                tmp(k) = nums(i)
                k += 1
                i += 1
            }
    
            while (j <= right) {
                tmp(k) = nums(j)
                k += 1
                j += 1 
            }
    
            i = left
            j = 0
    
            while (i <= right) {
                nums(i) = tmp(j)
                i += 1
                j += 1
            }
    
            return res
        }
    }
    
    var tmp []int
    func reversePairs(nums []int) int {
        tmp = make([]int, 50005)
        return mergeSort(nums, 0, len(nums)-1)
    }
    
    func mergeSort(nums []int, left, right int) int {
        if left >= right {return 0}
    
        mid := (left + right) >> 1
        res := mergeSort(nums, left, mid) + mergeSort(nums, mid+1, right)
    
        i, j, k := left, mid+1, 0
        for  i <= mid && j <= right {
            if nums[i] <= nums[j] {
                tmp[k] = nums[i]
                k += 1
                i += 1
            } else {
                res += mid - i + 1
                tmp[k] = nums[j]
                k += 1
                j += 1
            }
        }
    
        for i <= mid {
            tmp[k] = nums[i]
            k += 1
            i += 1
        }
    
        for j <= right {
            tmp[k] = nums[j]
            k += 1
            j += 1
        }
    
        for i, j := left, 0; i <= right; {
            nums[i] = tmp[j]
            i += 1
            j += 1
        }
    
        return res
    }
    
  • 相关阅读:
    (转)构建自己的AngularJS,第一部分:Scope和Digest
    使用CSS3 制作一个material-design 风格登录界面
    SS
    从零开始构建 Wijmo & Angular 2 小应用
    JavaScript使用构造函数获取变量的类型名
    Luogu-1527 [国家集训队]矩阵乘法
    Codeforces Round #525 (Div. 2)
    BZOJ-3879: SvT
    BZOJ-1396: 识别子串
    计算几何模板
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/14181963.html
Copyright © 2011-2022 走看看