package com.interview.books.ccinterview; /** * Created_By: stefanie * Date: 14-12-13 * Time: 下午11:18 */ public class CC27_MinIndicesSort { public int[] findIndices(int[] array){ int leftEnd = findEndOfLeftSubsequence(array); int rightBegin = findBeginOfRightSubsequence(array); int minIdx = leftEnd + 1; if(minIdx >= array.length) return new int[]{-1, -1}; int maxIdx = rightBegin - 1; for(int i = leftEnd; i <= rightBegin; i++){ if(array[i] < array[minIdx]) minIdx = i; else if(array[i] > array[maxIdx]) maxIdx = i; } leftEnd = shrinkLeft(array, minIdx, leftEnd); rightBegin = shrinkRight(array, maxIdx, rightBegin); return new int[]{leftEnd, rightBegin}; } private int findEndOfLeftSubsequence(int[] array) { for(int i = 1; i < array.length; i++){ if(array[i] < array[i - 1]) return i - 1; } return array.length - 1; } private int findBeginOfRightSubsequence(int[] array) { for(int i = array.length - 2; i >= 0; i--){ if(array[i] > array[i + 1]) return i + 1; } return 0; } private int shrinkLeft(int[] array, int minIdx, int leftEnd) { while(leftEnd >= 0 && array[leftEnd] > array[minIdx]){ leftEnd--; } return leftEnd + 1; } private int shrinkRight(int[] array, int maxIdx, int rightBegin) { while(rightBegin < array.length && array[rightBegin] < array[maxIdx]){ rightBegin++; } return rightBegin - 1; } public static void main(String[] args){ CC27_MinIndicesSort finder = new CC27_MinIndicesSort(); int[] array = new int[]{1,2,4,7,10,11,7,12,6,7,16,18,19}; int[] indices = finder.findIndices(array); System.out.println(indices[0] + ", " + indices[1]); //3,9 } }