Shortest Unsorted Continuous Subarray

此题如果排序的话,我们只需要比较最左边一个和排序数组不一样的位置,还有最右边不一样的位置,这个区间就是最短未排序区间了

class Solution(object):
    def findUnsortedSubarray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        tmp = sorted(nums)
        left = -1
        for index, num in enumerate(nums):
            if num != tmp[index]:
                left = index
                break

        n = len(nums)
        right = n
        for i in xrange(n - 1, -1, -1):
            if nums[i] != tmp[i]:
                right = i
                break

        return right - left + 1 if left != -1 else 0

此题解法很多,这里再写一种O(n)的解法,其实本质上跟排序这个很相近,都是找最边界的未排好序的位置,不过这里利用了单调栈进行一次递增一次递减的栈操作,最后可以得到最左和最右的位置

class Solution(object):
    def findUnsortedSubarray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)
        stack = []
        left = sys.maxint
        for i in xrange(n):
            while stack and nums[stack[-1]] > nums[i]:
                left = min(left, stack.pop())
            stack.append(i)

        right = -sys.maxint
        stack = []
        for i in xrange(n - 1, -1, -1):
            while stack and nums[stack[-1]] < nums[i]:
                right = max(right, stack.pop())
            stack.append(i)

        return right - left + 1 if left != sys.maxint else 0

results matching ""

    No results matching ""