给定一个无序数组arr,求出需要排序的最短子数组长度。例如: arr = [1,5,3,4,2,6,7] 返回4,因为只有[5,3,4,2]需要排序。

思路

首先从左往右遍历,然后设定一个Max,如果遍历的过程中array[i]大于Max,则置换Max,若小于Max,则指定 k 记录该位置。

然后再从右往左遍历,设定一个Min,在遍历的过程中array[i]小于Min,则置换Min,若大于Min,则指定 j 记录该位置。

于是 j~~k之间的就是需要排序的。

如上例,Max首先是1,然后遍历

Max=1,array[i]=1,置换Max,Max=1

Max=1,array[i]=5,置换Max,Max=5

Max=5,array[i]=3,k指向3,k=2,此时5~~3之间需要排序

Max=5,array[i]=4,k指向4,k=3,此时5~~4之间需要排序

依次类推,k最终指向2.

从右往左遍历的结果类似。

public class ShortNeedSortNum {

  public static void main(String[] args) {

  int[] arr = {4,5,3,2,1,6,7};

   System.out.println(getMinlength(arr));

  }

  public static int getMinlength(int[] arr){

     if(arr==null||arr.length==0){

       return 0;

    }

    int length = arr.length;

     int min = arr[length-1];

int noMinIndex = -1;

     for(int i=length-2; i>=0; i--){

     if(arr[i]>min){

       noMinIndex = i;

     }else{

       min = arr[i];    

     }

    }

    if(noMinIndex==-1){

     return 0;

    }

     int max = arr[0];

int noMaxIndex = -1;

     for(int i=1; i<length; i++){

      if(arr[i]<max){

       noMaxIndex = i;

     }else{

          max = arr[i];

        }

      }

     return noMaxIndex-noMinIndex+1;

    }

}

时间: 2024-12-31 03:23:10

给定一个无序数组arr,求出需要排序的最短子数组长度。例如: arr = [1,5,3,4,2,6,7] 返回4,因为只有[5,3,4,2]需要排序。的相关文章

[算法]需要排序的最短子数组长度

题目: 给定一个无序数组,求出需要排序的最短子数组的长度. 例如:arr={1,5,3,4,2,6,7}返回4,因为只有[5,3,4,2]需要排序. 思路: 解决这个问题可以在时间复杂度为O(N).额外空间复杂度为O(1)完成. 初始化变量noMinIndex=-1,从右向左遍历,便利的过程记录右侧出现过的数的最小值,记为min.假设当前数为arr[i],如果arr[i]>min,说明如果要整体有序,min值必然会移到arr[i]的左边.用noMinIndex记录最左边出现这种情况的位置.如果遍

《程序员代码面试指南》第八章 数组和矩阵问题 需要排序的最短子数组长度

题目 需要排序的最短子数组长度 java代码 package com.lizhouwei.chapter8; /** * @Description: 需要排序的最短子数组长度 * @Author: lizhouwei * @CreateDate: 2018/4/29 8:03 * @Modify by: * @ModifyDate: */ public class Chapter8_5 { public int getMinLength(int[] arr) { if (arr == null

需要排序的最短子数组长度

要求: 给定一个无序数组arr,求出需要排序的最短子数组长度 1 // getMinLength.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 7 using namespace std; 8 9 void getMinLength(int arr[],int len) 10 { 11 if(len == 0) 12 return; 13 14 //从后往前找到最小值,并记

2-1-需排序的最短子数组长度

题目描述: 对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度. 给定一个整数数组A及它的大小n,请返回最短子数组的长度. 测试样例: [1,5,3,4,2,6,7],7 返回:4 1 /* 2 这个题在牛客网上的讲解我感觉是有点问题的, 3 因为默认了升序排序! 4 如下实现对数组[8,7,6,5,4,3]的结果将会是6, 5 实际上此时的结果应该为0,因为现在已经是有序的了. 6 */ 7 #include <iostream> 8 #include <vector&

需要排序的最短子数组的长度——是一个排序好的数组,中间某一部分被打乱了,让你找出打乱的那个子数组

需要排序的最短子数组的长度 貌似在leetcode上遇到过,就是一个排序好的数组,中间某一部分被打乱了,让你找出打乱的那个子数组. from:https://blog.csdn.net/behboyhiex/article/details/80758686 [题目] 给定一个无序数组arr,求出需要排序的最短子数组长度. 例如: arr = [1, 5, 3, 4, 2, 6, 7]返回4,因为只有[5, 3, 4, 2]需要排序. [思路] 双指针 第一次从左向右遍历,找左边比当前位置大的 第

Java -- 给定一个int数组,拼接出最大数值

public class ZhiJieTiaoDong { /* 给定一个数组:组合成最大数值 */ public String szpj(int[] args){ if(null == args || args.length == 0){ return ""; } StringBuilder stringBuilder = new StringBuilder(); int[] yxsz = compareSZ(args); for (int i = args.length - 1;

第二章 排序 || 第19节 最短子数组练习题

题目 对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度. 给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的长度.(原序列位置从0开始标号,若原序列有序,返回0).保证A中元素均为正整数. 测试样例: [1,4,6,5,9,10],6 返回:2 解析 C++版 class Subsequence { public: int shortestSubsequence(vector<int> A, int n) { // write code here int sta

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数

题目描述: 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数.   你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用.示例:给定 nums = [2, 7, 11, 15], target = 9返回 [0, 1] 思路: 第一层for循环从索引0到倒数第二个索引拿到每个数组元素,第二个for循环遍历上一层for循环拿到的元素的后面的所有元素. 具体代码: 1 public class Solution { 2 public int[] twoSum(int[] nums,

刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的题.去发现问题. 题目:     给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 解析: 实际这里就是给你的一个列表的数字,给你一个预期,让你返