1、题目如下:
2、题解代码实现:
浅看题解,解题思路和本人接替思路一毛一样,奈何没有想到用双指针,在代码实现上也存在问题。当知道用双指针的时候,本题也变得相对简单。思路如下:
a、输入仅存在两种场景,数组本身是升序排列的和数组存在乱序的,存在乱序的意思就是存在驼峰元素nums[n] < nums[n-1],此时整个数组就不是纯粹升序的。
b、当数组乱序时,找到数组第一个、最后一个驼峰元素,他们之间的长度就是答案
c、当数组升序排列时,结果为0
代码如下:
class Solution:
def findUnsortedSubarray(self, nums: List[int]) -> int:
nums_compare = sorted(nums) #将源列表排序
ans = 0 #初始化输出结果为0(当列表本身就是升序的时候输出结果也是0)
left = 0 #左指针
right = len(nums_compare) - 1 #右指针
while left < right:
#当左指针相等时,左指针右移一位
if nums[left] == nums_compare[left]:
left += 1
#当右指针相等时,右指针左移一位
if nums[right] == nums_compare[right]:
right -= 1
#当左右指针都不相等时,输出结果,退出循环
if nums[left] != nums_compare[left] and nums[right] != nums_compare[right]:
ans = right - left + 1
break
return ans
以上代码,如果感觉在if条件里面少判断了数组是否升序的话,是由于在声明ans的时候默认数组时升序,所以初始化为0。如果便于理解可以参考以下代码:
代码如下:
class Solution:
def findUnsortedSubarray(self, nums: List[int]) -> int:
nums_compare = sorted(nums) #将源列表排序
left = 0 #左指针
right = len(nums_compare) - 1 #右指针
while left < right:
#当左指针相等时,左指针右移一位
if nums[left] == nums_compare[left]:
left += 1
#当右指针相等时,右指针左移一位
if nums[right] == nums_compare[right]:
right -= 1
#当左右指针都不相等时,输出结果,退出循环
if nums[left] != nums_compare[left] and nums[right] != nums_compare[right]:
break
if left >= right:
return 0
return right - left + 1