Slice Down Problem in Java, Hacker Rank Interview Question
Input: array of integer value
Output: print each iteration by subtracting the smallest elements till array becomes empty
For example:
For input array: 4, 3, 5, 8, 12
At each iteration, find minimum number and subtract it from element and print non zero elements
1 2 5 9 (Subtracted 3 from each elements)
1 4 8 (Subtracted 1 from each elements)
3 7 (Subtracted 1 from each elements)
4 (Subtracted 3 from each elements)
For the above problem, naive approach is to find the minimum in each iteration, subtracting it and copy it in new memory.
There are 2 place where you can improve on memory as well as the time complexity (less iteration).
1. Identify minimum value while subtracting the minimum value
2. Do not copy element to another array, just simple store the last index value and decrease it in recursive call.
Read full article from Slice Down Problem in Java, Hacker Rank Interview Question
Input: array of integer value
Output: print each iteration by subtracting the smallest elements till array becomes empty
For example:
For input array: 4, 3, 5, 8, 12
At each iteration, find minimum number and subtract it from element and print non zero elements
1 2 5 9 (Subtracted 3 from each elements)
1 4 8 (Subtracted 1 from each elements)
3 7 (Subtracted 1 from each elements)
4 (Subtracted 3 from each elements)
For the above problem, naive approach is to find the minimum in each iteration, subtracting it and copy it in new memory.
There are 2 place where you can improve on memory as well as the time complexity (less iteration).
1. Identify minimum value while subtracting the minimum value
2. Do not copy element to another array, just simple store the last index value and decrease it in recursive call.
public static void main(String args[]){ SliceDown sd = new SliceDown(); int a[] = {15,12,10,5,3}; printArray(a, a.length); int smallestIndex = findSmallest(a); sd.sliceDown(a,a.length,smallestIndex); } /* * recursively call this method by passing the index value of * min number and the range that needs to be sliced down */ public void sliceDown(int a[],int range, int smallestIndex){ int new_range = 0; int new_smallestIndex = -1; int smallNumber = a[smallestIndex]; for(int i=0;i<range;i++){ // To skip the number which is going to be slice down if(a[i]!=smallNumber){ a[new_range] = a[i] - smallNumber; //To initialize & find the new minimum number for next iteration if(new_smallestIndex<0){ new_smallestIndex = new_range; }else if(a[new_range] < a[new_smallestIndex]){ new_smallestIndex = new_range; } new_range++; } } printArray(a,new_range); if(new_range>1){ sliceDown(a, new_range,new_smallestIndex); } } //This method will be called only once for the first iteration private static int findSmallest(int a[]){ int smallestIndex = 0; for(int i=1;i<a.length;i++){ if(a[smallestIndex]>a[i]){ smallestIndex = i; } } return smallestIndex; } public static void printArray(int a[],int range){ for(int i=0;i<range;i++){ System.out.print(a[i]+" "); } System.out.println(""); }