581. 最短无序连续子数组_【有最字,但不用dp】

71 篇文章 0 订阅
19 篇文章 0 订阅

问题

给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

你找到的子数组应是最短的,请输出它的长度。
例子

在这里插入图片描述

思路
不用动态规划。
我们将数组 nums排序,然后我们比较 nums 和 排序后的元素找到最左边和最右边不匹配的元素。它们之间的子数组就是要求的最短无序子数组。

  • 方法1

  • 方法2

    从左往右遍历,如果该元素nums[i]<到目前为止的最大值【本来应该>左边的最大值】,则表示该数应该调整,并将high=i,则最后一个要调整的数为high
    从右往左遍历,如果该匀速nums[i]>到目前为止的最小值【本来应该<右边的最小值】,则表示该数应该调整,并将low=i,则最后一个要调整的数为low

    当是正序时,low=-1, high=len,所以要先看high>=low?

代码

//方法1
class Solution {
    public int findUnsortedSubarray(int[] nums) {
        int[] arr = Arrays.copyOfRange(nums,0,nums.length);
        Arrays.sort(arr);
        
        int i=0,j=nums.length-1;
        while(i<=nums.length-1) {
            if(arr[i]<nums[i]) break;
            i++;
        }
        while(j>=0) {
            if(arr[j]>nums[j]) break;
            j--;
        }
        //可能是正排序 i=len,j=-1
        return j-i+1>0?j-i+1:0;
        
    }
}
//方法2
class Solution {
    public int findUnsortedSubarray(int[] nums) {
        if(nums.length==1) return 0;
        int max = nums[0],min=nums[nums.length-1];
        int high = 0,low=nums.length-1;
        
        for(int i=1;i<nums.length; i++) {
            
            max = Math.max(max, nums[i-1]);
            if(nums[i]<max) high=i;
        }
        for(int i=nums.length-2; i>=0; i--) {
            min = Math.min(min, nums[i+1]);
            if(nums[i]>min) low=i;
        }
        
        return high>=low?high-low+1:0;
        
    }
}
给定长度为 n 的无序数字数组,在 JavaScript 中,我们可以利用这个数组构建一个二叉树。其中,数组的每个数字代表二叉树的叶节点的权值。 首先,我们需要创建一个二叉树的节点类,每个节点包含一个值属性和左右节点属性。接下来,我们可以通过遍历数组,逐个创建叶节点,并按照二叉树的规则,将节点插入到合适的位置。 具体实现步骤如下: 1. 创建一个节点类,包含值属性(value)、左节点属性(left)和右节点属性(right)。 2. 定义一个函数,用于构建二叉树。函数输入为一个无序的数字数组数组的长度 n。 3. 根据数组的第一个数字创建根节点,并将其作为当前节点。 4. 遍历数组中的其他数字,依次创建叶节点。 5. 对于每个叶节点,从根节点开始,根据当前节点的值与叶节点的值的大小关系,将叶节点插入到左树或右树中。 6. 重复步骤 4-5,直到遍历完整个数组。 7. 返回根节点,即为构建好的二叉树的根节点。 以下是一个简化的示例代码: ``` class Node { constructor(value) { this.value = value; this.left = null; this.right = null; } } function buildBinaryTree(arr, n) { if (n === 0) { return null; } const root = new Node(arr[0]); for (let i = 1; i < n; i++) { const leaf = new Node(arr[i]); let current = root; while (true) { if (leaf.value < current.value) { if (current.left) { current = current.left; } else { current.left = leaf; break; } } else { if (current.right) { current = current.right; } else { current.right = leaf; break; } } } } return root; } // 示例用法 const arr = [5, 3, 7, 1, 4, 6, 8]; const n = arr.length; const root = buildBinaryTree(arr, n); // 打印结果,方便进行验证 console.log(root); ``` 以上是通过给定长度为 n 的无序数字数组,构建一个二叉树的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值