zoukankan      html  css  js  c++  java
  • leetCode-Shortest Unsorted Continuous Subarray

    Description:
    Given an integer array, you need to find one continuous 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 the shortest such subarray and output its length.

    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.

    Note:

    Then length of the input array is in range [1, 10,000].
    The input array may contain duplicates, so ascending order here means <=.

    Solution:

    public class Solution {
        public int findUnsortedSubarray(int[] nums) {
            int n = nums.length;
            int[] temp = nums.clone();
            Arrays.sort(temp);
    
            int start = 0;
            while (start < n  && nums[start] == temp[start]) start++;
    
            int end = n - 1;
            while (end > start  && nums[end] == temp[end]) end--;
    
            return end - start + 1;
        }
    }

    Better Solution:

    //low和high分别存储nums中从左边和右边遍历不满足有序的下标,找到low和high,然后找出low和high之间的最小值和最大值,从low向左遍历nums,将low定位到比low和high之间最小值还小的小标,从high向右遍历nums,将high定位到比low和high之间最大值还大的小标。将high-low-1即为无序长度
    class Solution {
        public int findUnsortedSubarray(int[] nums) {
            int low = 0, high = nums.length-1, max = Integer.MIN_VALUE, min = Integer.MAX_VALUE;
            while(low<high&&nums[low+1]>=nums[low]) low++;
            while(high>low&&nums[high-1]<=nums[high]) high--;
    
            if(low>=high) return 0;
    
            for(int i= low;i<=high;i++){
                max =Math.max(max, nums[i]);
                min = Math.min(min, nums[i]);
            }
    
            while(low>=0&&nums[low]>min) low--;
            while(high<=nums.length-1&&nums[high]<max) high++;
    
            return high- low -1;
        }
  • 相关阅读:
    ZJOI2017 Day3 滚粗记
    ZJOI2017 Day2
    bzoj4245 [ONTAK2015]OR-XOR (贪心)
    bzoj4631 踩气球 (树状数组+线段树)
    bzoj5219 [Lydsy2017省队十连测]最长路径 (DP)
    bzoj5216 [Lydsy2017省队十连测]公路建设 (线段树)
    bzoj2754 [SCOI2012]喵星球上的点名 (后缀数组+树状数组)
    bzoj2342 [Shoi2011]双倍回文 (manacher)
    bzoj4657 tower (最小割)
    bzoj2064 分裂 (状压dp)
  • 原文地址:https://www.cnblogs.com/kevincong/p/7900376.html
Copyright © 2011-2022 走看看