标签:遍历 nums big 581 无序 最短 high low 重排
思路:
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
标签:遍历,nums,big,581,无序,最短,high,low,重排 来源: https://www.cnblogs.com/panweiwei/p/12757510.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。