【题解】需要排序的子数组

题目:

{1,2,5,3,7,4},需要排序的最小子数组是4。

思路

  1. 左端点:p1。右端点:p2。
  2. 找右端点–先确定第一个转折点,然后找历史最高点,然后之后的比历史最高点小的数字为p2。
  3. 找左端点,虽然第二步时,已经确定了一个左端点,但是很有可能在左端点之前会出现比历史最小值还小的点,所以由于考虑这种情况,必须对左端点重新确定。先找历史最低点,然后在历史最低点的左侧还要高的数字,则拓展左端点。

代码

static void f(int[] A, int n){
		int p1 = -1; //左边界
		int p2 = -1; //右边界
		
		int max = A[0];
		int min = A[n-1];
		
		//找右端点,更新历史最高,只要出现比历史最高低的点,就应该将右边界拓展到此处
		for (int i = 0; i < A.length; i++) {
		// i < n-1 是为了保证A[i+1]不会越界
		// p1 == -1,是为了确定这是第一次出现的拐点。
			if(i < n-1 && A[i] > A[i+1] && p1 == -1){
				p1 = i;
				//System.out.println("1:"+p1);
			}
			//更新历史最高
			if(A[i]>max){
				max = A[i];
			}
			//只要低于历史高峰,就要扩展要排序的右端点
			if(A[i]<max){
				p2 = i;
			}
		}
		
		//找左端点,更新历史最低,只要左侧出现比历史最低高的,就应该将左边界扩展到此处
		for (int i = n-1; i >= 0; i--) {
			if(A[i] < min){
				min = A[i];
			}
			if(A[i] > min){
				p1 = i;
				//System.out.println("2:"+p1);
			}
		}
		
		if(p1 == -1 ){
			System.out.println("[0,0]");
			return;
		}
		
		System.out.println("["+p1+","+p2+"]");
		
	}
	
	public static void main(String[] args) {
		int[] arr= {1,2,5,3,7,4};
		f(arr, arr.length);
		
	}
发布了81 篇原创文章 · 获赞 13 · 访问量 2383

猜你喜欢

转载自blog.csdn.net/alovelypeach/article/details/104227571