欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数组与矩阵---需要排序的最短子数组长度

程序员文章站 2024-03-16 13:34:10
...

【题目】

  给定一个无序数组arr,求出需要排序的最短子数组长度。
  例如: arr = [1, 5, 3, 4, 2, 6, 7]返回4,因为只有[5, 3, 4, 2]需要排序。

【基本思路】

  解决这个问题可以做到时间复杂度O(N),空间复杂度O(1)。
  
  首先从右到左遍历数组,使用两个变量,minOne记录遍历过程中出现的最小元素,minIndex表示需要调整的子数组的起始下标位置,开始时minOne = arr[len(arr)-1],minIndex = -1。遍历的过程中,如果发现此时的元素arr[i]的值大于minOne,说明如果要使数组有序,arr[i]必须要向右移动,所以令minIndex = i;如果arr[i] 小于minOne,则令minOne = arr[i]。遍历结束后,如果minIndex 等于-1,说明该数组本身就是有序的,返回0,;否则minIndex就是需要排序数组的起始位置。

  同理,我们再从左到右遍历一次数组,使用maxOne,maxIndex两个变量即可找到需要排序数组的末尾下表位置,该子数组的长度即可得到。

【代码实现】

#python3.5
def getMinLength(arr):
    if arr == None or len(arr) < 2:
        return 0
    minOne = arr[-1]
    minIndex = -1
    for i in range(len(arr)-2, -1, -1):
        if arr[i] > minOne:
            minIndex = i
        else:
            minOne = arr[i]
    if minIndex == -1:
        return 0
    maxOne = arr[0]
    maxIndex = -1
    for i in range(1, len(arr)):
        if arr[i] < maxOne:
            maxIndex = i
        else:
            maxOne = arr[i]
    return maxIndex - minIndex + 1
相关标签: 数组 python