
思路:
1、从左往右遍历,每一趟找出此前的最大值max,若nums[i]<max,则num[i]是需要参与重排的;
2、遍历到最右端,记录下最右边一个需要重排元素,其下标为high;
3、从右往左遍历,每一趟找出此前的最小值min,若nums[i]>min,则num[i]是需要参与重排的;
4、遍历到最左端,记录下最左边一个需要重排元素,其下标为low;
5、在nums中下标从low到high的元素即是需要重排的,返回值为:high-low+1。
注:若nums本就升序排列,则无需重排,返回值是0。
python中,倒序遍历list:从最后一个元素循环到第一个元素:
for i in range(len(nums) - 1, -1, -1):
本题代码实现:
1 class Solution(object):
2 def findUnsortedSubarray(self, nums):
3 """
4 :type nums: List[int]
5 :rtype: int
6 """
7 # 从左往右遍历,找high
8 # big用来记录每一趟的最大值
9 big = nums[0]
10 high = 0
11 for i in range(1, len(nums)):
12 # 记录需要参与重排的元素的下标
13 if nums[i] < big:
14 high = i
15 # 更换遍历中的最大值
16 elif nums[i] > big:
17 big = nums[i]
18 # 从右往左遍历,找low
19 # small用来记录每一趟遍历的最小值
20 small = nums[-1]
21 low = len(nums) - 1
22 for j in range(len(nums) - 1, -1, -1):
23 # 记录需要参与重排的元素的下标
24 if nums[j] > small:
25 low = j
26 # 更变遍历中的最小值
27 elif nums[j] < small:
28 small = nums[j]
29 # 若nums本就升序,无需重排
30 if low - high + 1 == len(nums):
31 return 0
32 # 否则返回high - low + 1
33 else:
34 return high - low + 1
35
36
37 if __name__ == '__main__':
38 solution = Solution()
39 # print(solution.findUnsortedSubarray([1, 2, 3, 4]))
40 print(solution.findUnsortedSubarray([2, 6, 4, 8, 10, 9, 15]))
若nums本就有序时也可在代码前先做处理:
1 #升序排
2 s = sorted(nums)
3 #排序前后一致
4 if nums == s:
5 return 0