1. 程式人生 > >【python3】leetcode 581. Shortest Unsorted Continuous Subarray(easy)

【python3】leetcode 581. Shortest Unsorted Continuous Subarray(easy)

 581. Shortest Unsorted Continuous Subarray(easy)

Given an integer array, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order, too.

You need to find the shortest such subarray and output its length.

Example 1:

Input: [2, 6, 4, 8, 10, 9, 15]
Output: 5
Explanation: You need to sort [6, 4, 8, 10, 9] in ascending order to make the whole array sorted in ascending order.

 哇這個真的是最近寫的最長的程式碼了 不過邏輯很簡單就是先把nums排序

然後找第一個和最後一個不相等的分別為未排序子串的首尾start 和end,

用兩個while比用一個while省時間因為不用遍歷完整個list

一、兩個while

class Solution:
    def findUnsortedSubarray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        length = len(nums)
        sortnums = sorted(nums)
        if length == 1 or sorted(nums) == nums:return 0
        start = 0
        end = length - 1
        i = 0
        while(i < length):
            if nums[i] != sortnums[i]:
                start = i
                break
            i += 1
        i = length - 1
        while(i >= 0):
            if nums[i] != sortnums[i]:
                end = i
                break
            i -= 1
        return end - start + 1
            
              

Runtime: 96 ms, faster than 66.33% of Python3

二、一個while

class Solution:
    def findUnsortedSubarray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        length = len(nums)
        sortnums = sorted(nums)
        if length == 1 or sorted(nums) == nums:return 0
        start = length
        end = 0
        i = 0
        while(i < length):
            if nums[i] != sortnums[i]:
                start = min(start,i)
                end = max(end,i)
            i += 1
        return end - start + 1

Runtime: 128 ms, faster than 37.42% of Python3