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
    }
    
  • 相关阅读:
    20160405小结
    [HTML表格]在databases显示行的附加信息
    [django]django+datatable简单运用于表格中
    [django]django xlrd处理xls中日期转换问题
    烦!
    【数据库】Navicat Premium12远程连接MySQL数据库
    关于定义变量名为"name"的坑!!!
    【前端】前端面试题整理
    Firebug控制台详解
    什么是跨域?跨域解决方法
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/14181963.html
Copyright © 2011-2022 走看看