算法提高之LeetCode刷题数据结构和算法分析

数组中的逆序对

2020-04-24  本文已影响0人  _阿南_

题目:

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5

题目的理解:

取每一个数与后面的每一个数比较,如果大于后面的数则计数加1. 遍历完成后返回计数。

from typing import List

class Solution:
    def reversePairs(self, nums: List[int]) -> int:

        def lessNums(num: int, afterNums: List[int]) -> int:
            afterNums.sort()
            numsLength = len(afterNums)

            middle = numsLength // 2
            while True:
                if middle == 0:
                    if num <= afterNums[middle]:
                        return 0
                if middle == numsLength - 1:
                    if num > afterNums[middle]:
                        return numsLength

                if num > afterNums[middle]:
                    if middle + 1 <= numsLength - 1:
                        if num <= afterNums[middle + 1]:
                            return middle + 1

                    middle = (numsLength + middle) // 2
                    continue

                if num <= afterNums[middle]:
                    if middle == 0:
                        return 1

                    middle //= 2
                    continue

        result = 0
        for index, num in enumerate(nums):
            if index > len(nums) - 2:
                break

            resultOne = lessNums(num, nums[(index + 1):])
            result += resultOne

        return result

用了二分法来提高效率,时间复杂度O(n! * log(n)), 计算超时了。

开始看题目吧 !_!

python实现

没实现。

想看最优解法移步此处

提交

权当学习了。

// END 数学才是这个世界的主宰

上一篇下一篇

猜你喜欢

热点阅读