leetcod记录:难度简单:581. 最短未分类连续子阵列

题目出处:https://leetcode.com/problems/shortest-unsorted-continuous-subarray/

题目描述:

给定一个整数数组,您需要找到一个连续的子数组,如果您只按升序对该子数组进行排序,那么整个数组也将按升序排序。您需要找到最短的子阵列并输出其长度。

如下面的例子,[2,6,4,8,10,9,15],正常排序应该是[2,4,6,8,9,10,15],所以原数组要从下标1开始改变,一直要到下标5才能改变成正常的排序,所以需要改变的数组是[6,4,8,10,9],这个长度是 5(右下标)-1(左下标)+1=5

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.

代码:

var findUnsortedSubarray = function (nums) {
        var len = nums.length;
        var left = nums.length;
        var right = 0;
        for (var i = 0; i < len - 1; i++) {
            for (var j = i + 1; j < len; j++) {
                if (nums[j] < nums[i]) {
                    //当出现需要改变的数组元素时,记录下标,
                    left = Math.min(i, left);
                    right = Math.max(j, right);
                }
            }
        }
        //以下这个3目运算符是过滤掉不需要排序的数组
        return right - left + 1 < 0 ? 0 : right - left + 1
    };
    var arr = [2, 6, 4, 8, 10, 9, 15];
    console.log(findUnsortedSubarray(arr));

 

思路:

对比数组内每一个元素的相邻元素,只需要前后对比即可,当出现左边(前面)大于右边(后面)时候,就说明出现了需要进行修改的下标,对所有这种下标进行记录,这些需要改变的下标的最小值和最大值就是所需要改变的数组下标的区间,再右区间减去左区间。

官方解释:

我们可以遍历给定的numsnums数组,选择元素nums [i] nums [i]。对于选择的每个这样的元素,我们尝试确定它在排序数组中的正确位置。为此,我们将nums [i] nums [i]与每个n [j] nums [j]进行比较,使得i <j <ni <j <n。这里,nn指的是numsnums数组的长度。

如果任何nums [j] nums [j]恰好小于nums [i] nums [i],则意味着nums [i] nums [i]和nums [j] nums [j]都不正确排序数组的位置。因此,我们需要交换这两个元素以使它们处于正确的位置。在这里,我们只注意nums [i] nums [i](由ii给出)和nums [j] nums [j](由jj给出)的位置,而不是交换。这两个元素现在标记了未排序的子阵列的边界(至少暂时)。

因此,在所选择的所有nums [i] nums [i]中,我们确定最左边的nums [i] nums [i]不在其正确的位置。这标记了最小的未排序子阵列(ll)的左边界。同样地,在所有nums [j] nums [j]中考虑了所有nums [i] nums [i],我们确定最右边的nums [j] nums [j]不在其正确的位置。这标志着最小的未排序子阵列(rr)的右边界

 

笔记:

1.不可以用sort函数排序后再与原数组对比,因为sort函数是直接对原数组进行操作,无法储存最原始的数组,只能得到一个排序好的数组,因为参数是引用的

猜你喜欢

转载自blog.csdn.net/weixin_42273637/article/details/86767032
今日推荐