581. Shortest Unsorted Continuous Subarray

Medium (Trung bình) Python 🔗 Xem trên LeetCode

📋 Đề Bài

Given an integer array nums, 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.

Return the shortest such subarray and output its length.

 

Example 1:

Input: nums = [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.

Example 2:

Input: nums = [1,2,3,4]
Output: 0

Example 3:

Input: nums = [1]
Output: 0

 

Constraints:

  • 1 <= nums.length <= 104
  • -105 <= nums[i] <= 105

 

Follow up: Can you solve it in O(n) time complexity?

🧠 Thuật Toán & Kỹ Thuật

Sorting (Sắp xếp)
⏱️ Thời gian O(n²)
💾 Không gian O(n)

💻 Lời Giải

Python 0581-shortest-unsorted-continuous-subarray.py
class Solution:
    def findUnsortedSubarray(self, nums: List[int]) -> int:
        isSame = [a == b for a, b in zip(nums, sorted(nums))]
        
        if all(isSame):
            return 0
        
        n = len(isSame)
        
        l, r = 0, n - 1
        
        for i in range(n):
            if not isSame[i]:
                l = i
                break
                
        for i in range(n - 1, -1, -1):
            if not isSame[i]:
                r = i
                break
        
        return r - l + 1