Problem:
Given an integer n, break it in smallest non-repeating subsets.
Eg 1: 5
1 1 1 1 1
2 1 1 1
3 1 1
4 1
5
Eg 2: 10
1 1 1 1 1 1 1 1 1 1
2 1 1 1 1 1 1 1 1
3 1 1 1 1 1 1 1
4 1 1 1 1 1 1
5 1 1 1 1 1
6 1 1 1 1
7 1 1 1
8 1 1
2 2 2 2 2
3 3 3 1
4 4 2
5 5
6 4
7 3
8 2
9 1
10
Time Complexity (for main logic):
n + n + n + n (for 4 loops)
i.e. 4n
i.e. O(n)
Code:
public class SplitTheInteger { private int userInput; int[] temp; void start( int no ) { userInput = no; temp = new int[userInput]; for (int i = 0; i < userInput; i++) { temp[i] = 1; } int len = userInput-1; /** * its working for userinput 5 * 1 1 1 1 1 * 2 1 1 1 -1 * 3 1 1 -1 -1 * * 4 1 -1 -1 -1 //this is taken care by for * * loop below while loop so to avoid redundancy i have * made 'no-1' * * 5 */ while (temp[0] != no-1 ) { algo(); temp[0]++; temp[len] = -1; len--; } for (int i = 2; i <= userInput; i++) { /** * Suppose i = 3 * UserInput = 10 * 10/3 = 3 * so print 3 three times and call done which will select * such a number that will sum up UserInput i.e. 10 */ int m = userInput/i; int count = 0; while ( count != m ) { System.out.print( i + " "); count++; } if(i*count != userInput) done(count*i); System.out.println(); } } private void algo() { // TODO Auto-generated method stub int z = temp[0]; for (int k : temp) { if( k != -1) System.out.print(k + " "); } System.out.println(); } private void done(int i) { // TODO Auto-generated method stub for (int j = 1; j <= userInput; j++) { if(j+i == userInput) { System.out.print( j ); break; } } } public static void main(String[] args) { // TODO Auto-generated method stub new SplitTheInteger().start(10); } }
Good Luck! & Happy Coding!!!
No comments:
Post a Comment