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

【题目】

  给定一个无序数组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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值