0
点赞
收藏
分享

微信扫一扫

一个程序员的编程好习惯

小贴贴纸happy 2023-05-04 阅读 41

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

 

举报

相关推荐

0 条评论