题目描述
Given an integer array, you need to find onecontinuous 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 theshortestsuch subarray and output its length.
Example:
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.
Note:
1. Then length of the input array is in range [1, 10,000].
2. The input array may contain duplicates, so ascending order here means
分析
本题是Leetcode一道简单难度的题目,考察数组的基本知识点。一般数组问题我们都可以想到先排序,排序之后会发现比较多的有趣的线索。
本题要求找到能够排序之后使全局数组有序的子数组的长度,要求解子数组的长度,我们需要知道子数组的起点和终点的下标位置,那么问题就转变为如何求解子数组起点终点下标问题。
我们使用我们前面分析的策略,先对我们的数组排个序,然后我们和原数组比较一下,看看有什么发现。我们发现,通过一个元素一个元素的逐一比较,我们很容易就找到两个数组中第一个不一样元素的位置和最后一个不一样元素的位置,这两个位置正是我们要求解的子数组的起点和终点,问题得到解决。
同时不要忘记对边界条件的判断,如果起点和终点都相等的时候,那么意味着子数组并不存在。
代码
class Solution(object):
def findUnsortedSubarray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
'''
[2, 6, 4, 8, 10, 9, 15]
[2, 4, 6, 8, 9, 10, 15]
start = 1
end = 5
'''
if not nums:
return 0
sortedNums = sorted(nums)
start = end = -1
length = 0
for i in range(len(nums)):
if nums[i] != sortedNums[i]:
if start == -1:
start = i
end = i
if start == end:
length = 0
else:
length = end - start + 1
return length
视频教程
中文讲解
http://v.youku.com/v_show/id_XMzE0MDc0OTE4MA==.html?spm=a2hzp.8253869.0.0
https://www.youtube.com/watch?v=go1q1R3QLc0&feature=youtu.be
英文讲解
http://v.youku.com/v_show/id_XMzE0MDgyMjY0NA==.html?spm=a2hzp.8253869.0.0
https://www.youtube.com/watch?v=s191hahgPPo&feature=youtu.be
推荐Channel
Youtube Channel
https://www.youtube.com/channel/UCgOBOym0p20QGvsccsWHc0A
Youku 频道
http://i.youku.com/codingmonkey2017