牛客堂刷题(常见面试题精讲)之最短子数组长度

来源:互联网 发布:用ps制作淘宝店铺 编辑:程序博客网 时间:2024/06/04 01:04

题目

给定一个无序数组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 static int findShortestArray(){int [] arr = {2,1,3,4,5,9,7};//找寻最右边的kint max=arr[0];int min = arr[arr.length-1];int k=0,j=arr.length-1;for(int i=0;i<arr.length;i++){if(arr[i]>=max) max = arr[i];else k=i;}//找寻最左边的ifor(int i=arr.length-1;i>=0;i--){if(arr[i]<=min)min = arr[i];else j=i;}System.out.println("最左边的:"+j);System.out.println("最右边的:"+k);for(int i=j;i<=k;i++){System.out.print(arr[i]+"  ");}return k-j;}


0 0
原创粉丝点击