Arrays分类算法-Subarray Sort

该博客探讨了一种从乱序序列中找出最大和最小值,并确定需要重新排序的子数组范围的方法。通过从头尾遍历原数组,确定最大最小值的插入点,达到O(n)的时间复杂度和O(1)的空间复杂度。
题目要求在这里插入图片描述

解法一:
我们从乱序的序列出发,在乱序的序列中找出最大和最小的值,然后分别从原数组的头和尾部进行遍历,找出乱序最大最小值需要插入的点,就是需要重排序的范围.
Time: O(n) Space: O(1)
代码:

import java.util.*;

class Program {
  public static int[] subarraySort(int[] array) {
    // Write your code here.
		if (array == null || array.length < 2) return new int[] {};
		int minOutOfNum = Integer.MAX_VALUE;
		int maxOutOfNum = Integer.MIN_VALUE;
		
		for (int i = 0; i < array.length; i++) {
			if (isOutOfOrder(i, array[i], array)) {
				minOutOfNum = Math.min(minOutOfNum, array[i]);
				maxOutOfNum = Math.max(maxOutOfNum, array[i]);
			}
		}
		
		if (minOutOfNum == Integer.MAX_VALUE) {
			return new int[]{-1, -1};
		}
		
		int leftIdx = 0;
		while (minOutOfNum >= array[leftIdx]) {
			leftIdx++;
		}
		
		
		int rightIdx = array.length - 1;
		while (maxOutOfNum <= array[rightIdx]) {
			rightIdx--;
		}
		
    return new int[] {leftIdx, rightIdx};
  }
	
	public static boolean isOutOfOrder(int i, int num, int[] array) {
		if (i == 0) return num > array[i + 1];
		if (i == array.length - 1) return num < array[i - 1];
		return num > array[i + 1] || num < array[i - 1];
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值