package com.interview.dynamic; /** * http://www.geeksforgeeks.org/remove-minimum-elements-either-side-2min-max/ */ public class RemoveFromEndToMake2IntoMinGreaterThanMax { public int removeFromEnd(int input[]){ return removeFromEnd(input,0,input.length-1); } private int removeFromEnd(int input[],int low,int high){ if(low > high){ return input.length; } int min = min(input,low,high); int max = max(input,low,high); if(2*min > max){ return 0; } return Math.min(removeFromEnd(input,low,high-1), removeFromEnd(input,low+1,high)) +1; } private int min(int input[],int low,int high){ int min = Integer.MAX_VALUE; for(int i=low; i <=high; i++){ if(min > input[i]){ min = input[i]; } } return min; } private int max(int input[],int low,int high){ int max = Integer.MIN_VALUE; for(int i=low; i <=high; i++){ if(max < input[i]){ max = input[i]; } } return max; } public int removeFromEndDynamic(int input[]){ int T[][] = new int[input.length][input.length]; for(int l=1; l <= input.length; l++){ for(int i=0, j = i + l-1; i < input.length-l+1; i++,j++){ int min = min(input,i,j); int max = max(input,i,j); if(2*min > max){ T[i][j] = 0; }else{ T[i][j] = Math.min(T[i+1][j] , T[i][j-1]) +1; } } } return T[0][input.length-1]; } public static void main(String args[]){ int input[] = {5,1,3,1,3,8,3}; RemoveFromEndToMake2IntoMinGreaterThanMax rme = new RemoveFromEndToMake2IntoMinGreaterThanMax(); System.out.println(rme.removeFromEnd(input)); System.out.println(rme.removeFromEndDynamic(input)); } }