📌  相关文章
📜  需要重新排列以对给定数组进行排序的子数组的数量(1)

📅  最后修改于: 2023-12-03 14:58:43.526000             🧑  作者: Mango

需要重新排列以对给定数组进行排序的子数组的数量

问题描述

给定一个长度为 n 的整数数组 nums,你的任务是统计出需要重新排列的不同排序子数组的数量。两个子数组被认为不同的条件是其在原数组中的起始和结束位置不同。换句话说,若两个子数组中的某个数字在原数组中的位置不同,那么这两个子数组就是不同的。

解题思路

首先,对数组进行排序,将原数组排序后与原数组对比,一次遍历,当两个数组元素不同时记录当前位置,待遍历完成后根据这些位置计算需要重新排列的子数组的数量。

代码实现
def rearrange_arr(nums):
    sorted_nums = sorted(nums)
    start, end = None, None
    res = 0
    for i in range(len(nums)):
        if nums[i] != sorted_nums[i]:
            if start is None:
                start = i
            end = i
        else:
            if start is not None:
                res += 1
                start, end = None, None
    if start is not None:
        res += 1
    return res
复杂度分析

本算法中使用了一次排序,最坏情况下时间复杂度为O(nlogn)。再遍历一次数组,时间复杂度为O(n)。因此,整个算法时间复杂度为O(nlogn+n)=O(nlogn)。空间复杂度为O(n),用来存储排好序的数组。