LeetCode-581. Shortest Unsorted Continuous Subarray

来源:互联网 发布:ug编程如何加工t型槽 编辑:程序博客网 时间:2024/04/29 15:18

Description:

这里写图片描述

Example 1:

这里写图片描述

Note:

这里写图片描述

Solution 1(C++):

这里写图片描述

Solution 2(C++):

这里写图片描述

Solution 3(C++):

这里写图片描述

算法分析:

题目的意思就是要找到长度最短的子数列,这样的子数列满足条件,只要该数列排序完成,那么整个数列就排序完成,也就是说除了该数列以外的数列,也都是排序完成的。

解法一与解法二的思想都比较偷巧,既然整个数列,除了要找的子数列之外的其他数列已经排序好,那么,我们如果直接复制一个原数列,然后将复制的数列排序,与原数列比较,就能找到已经排序好的数列,那么原数列剩下的部分就是我们要找到的数列了,计算这个数列的长度就好了。

解法三的思路与前两个最大的不同就是不需要额外的存储空间,也就是说不需要额外复制一个数列。同样的,由于其他子数列是排好序的,那么我们从原数列的两端往中间遍历,先找到两端处的各递增数列。但是,如果我们仔细思考就会发现,我们要找的子数列,一旦排好序,就能直接无缝插入到其他子数列中,由于其他子数列是天然排序好的。那么子数列的最小值应该大于左边数列的最大值,子数列的最大值应该小于右边数列的最小值。那么这样就能完成子数列一旦排序好就能无缝插入。

所以,我们在第一步通过两端查询递增数列,直到左右两端第一个“逆序”元素对出现,那么这两个“逆序”元素对作为起终点的子数列需要重新排序。但是不能保证排序后能“无缝”与其他数列衔接。所以我们还需要寻找,当目标数列的最小值大于左边数列的最大值,并且目标数列的最大值小于左边数列的最小值,那么这个目标数列就是我们要找到的子数列。

程序分析:

我在这道题想尝试尽量简化代码,但还是颇有难度,只能不断做题,不断的学习。

原创粉丝点击