数组与矩阵---需要排序的最短子数组长度
程序员文章站
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