【算法基础】需要排序的最短子数组长度

给定一个无序数组arr,求出需要排序的子数组长度

 * 思路:
     *         先从右到左遍历数组
     *         min : 出现的最小元素
     *         noMinIndex : 出现无序(cur > min)时的位置
     *         再从左到右遍历数组
     *         max : 出现的最大元素
     *         noMaxIndex : 出现无序(cur < max)时的位置
     *         用noMaxIndex - noMinIndex得到结果 

源代码 

package com.javakk.ex;

/**
 * @Time 2018年8月30日 下午2:30:06
 * @Title { 需要排序的最短子数组长度 }
 * @Desc  { 给定一个无序数组arr,求出需要排序的子数组长度 }
 * @Email 92920@sohu.com
 * @Author JavaKK
 */
public class Ex10 {
	
	public static void main(String[] args) {
		int[] arr = { 1, 5, 3, 4, 2, 6, 7 };
		int n = getMinSortLength(arr);
		System.out.println(n);
	}

	/**
	 * 思路:
	 * 		先从右到左遍历数组
	 * 		min : 出现的最小元素
	 * 		noMinIndex : 出现无序(cur > min)时的位置
	 * 		再从左到右遍历数组
	 * 		max : 出现的最大元素
	 * 		noMaxIndex : 出现无序(cur < max)时的位置
	 * 		用noMaxIndex - noMinIndex得到结果
	 * @param arr
	 * @return
	 */
	private static int getMinSortLength(int[] arr) {
		if (arr == null || arr.length == 0) {
			return 0;
		}
		
		int min = arr[arr.length - 1];
		int noMinIndex = -1;
		for (int i = arr.length - 2; i > -1; i--) {
			if (arr[i] > min) {
				// 出现无序的情况
				noMinIndex = i;
			} else {
				min = Math.min(min, arr[i]);
			}
		}
		if (noMinIndex == -1) {
			// 已经有序
			return 0;
		}
		
		
		int max = arr[0];
		int noMaxIndex = -1;
		for (int i = 1; i < arr.length; i++) {
			if (arr[i] < max) {
				// 出现无序的情况
				noMaxIndex = i;
			} else {
				max = Math.max(max, arr[i]);
			}
		}
	 
		return  noMaxIndex - noMinIndex  + 1;
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值