// Comment //Inputs: int[] denoms = {25,10,5,1}; int[][] map = new int[100+1][denoms.length]; System.out.println(makeChange(100, denoms, 0)); System.out.println(makeChangeDP(100, denoms, 0, map)); // Recursive algorithm public static int makeChange(int amount, int[] denoms, int index) { if(index >= denoms.length-1) return 1; int denomAmount = denoms[index]; int ways = 0; for(int i = 0; i*denomAmount <= amount; i++) { int amountRemaining = amount-i*denomAmount; ways += makeChange(amountRemaining, denoms, index+1); } return ways; } // Dynamic programming.. map[amount+1][denoms.length] public static int makeChangeDP(int amount, int[] denoms, int index, int[][] map) { if(map[amount][index] != 0) return map[amount][index]; if(index >= denoms.length-1) return 1; int denomAmount = denoms[index]; int ways = 0; for(int i = 0; i*denomAmount <= amount; i++) { int amountRemaining = amount-i*denomAmount; ways += makeChange(amountRemaining, denoms, index+1); } map[amount][index] = ways; return ways; }
Saturday, September 6, 2014
Coin change problem
Thursday, September 4, 2014
Quick sort in Java
// Comment Quick Sort public static void quick_sort(int[] a) { int len = a.length; if (a == null || len == 0) throw new IllegalArgumentException("Null/Invalid Input"); quick_sortUtil(a, 0, len - 1); } private static void quick_sortUtil(int[] a, int l, int r) { if (l > r) return; int p = pivot(a, l, r); quick_sortUtil(a, l, p - 1); quick_sortUtil(a, p + 1, r); } private static int pivot(int[] a, int l, int r) { int x = a[r], j, i; for (i = l, j = l; i < r && j < r; i++) { if (a[i] <= x) { swapArr(a, i, j); j++; } } swapArr(a, j, r); return j; } private static void swapArr(int[] arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; }
Tets
// Comment public class Testing { public Testing() { } public void Method() { /* Another Comment on multiple lines */ int x = 9; } }
Merge sort in JAVA : Top-down implementation using lists
// Comment Merge Sort for array public static void mergeSort(int[] A) { if (A == null) throw new NullPointerException("Input doesn't exist."); int len = A.length; if (len == 0) throw new IllegalArgumentException("No input from user."); mergeSortUtil(A, 0, len - 1); } private static void mergeSortUtil(int[] a, int l, int r) { if (l >= r) return; int m = l + (r - l) / 2; mergeSortUtil(a, l, m); mergeSortUtil(a, m + 1, r); merge(a, l, m, r); } private static void merge(int[] a, int l, int m, int r) { int k = 0, i, j; int[] b = new int[(r - l) + 1]; for (i = l, j = m + 1; i <= m && j <= r;) { if (a[i] < a[j]) b[k++] = a[i++]; else b[k++] = a[j++]; } while (i <= m) b[k++] = a[i++]; while (j <= r) b[k++] = a[j++]; for (int s = l, f = 0; f < b.length; s++) { a[s] = b[f++]; } }
Top-down implementation using lists :
function merge_sort(list m) // Base case. A list of zero or one elements is sorted, by definition. if length(m) <= 1 return m // Recursive case. First, *divide* the list into equal-sized sublists. var list left, right var integer middle = length(m) / 2 for each x in m before middle add x to left for each x in m after or equal middle add x to right // Recursively sort both sublists. left = merge_sort(left) right = merge_sort(right) // *Conquer*: merge the now-sorted sublists. return merge(left, right)
In this example, the
merge
function merges the left and right sublists.function merge(left, right) var list result // assign the element of the sublists to 'result' variable until there is no element to merge. while length(left) > 0 or length(right) > 0 if length(left) > 0 and length(right) > 0 // compare the first two element, which is the small one, of each two sublists. if first(left) <= first(right) append first(left) to result left = rest(left) else append first(right) to result right = rest(right) else if length(left) > 0 append first(left) to result left = rest(left) else if length(right) > 0 append first(right) to result right = rest(right) end while return result
public static LNode mergeSortList(LNode list) { int len = length(list); if (len <= 1) return list; LNode left = list, right = null; right = addLeftList(left, len); left = mergeSortList(left); right = mergeSortList(right); LNode res = merge(left, right); return res; } private static int length(LNode list) { int len = 0; for (LNode curr = list; curr != null; curr = curr.next) len++; return len; } private static LNode addLeftList(LNode list, int n) { int m = n / 2; LNode curr = list; for (int i = 0; curr != null && i < m - 1; i++) curr = curr.next; list = curr.next; curr.next = null; return list; } private static LNode merge(LNode left, LNode right) { LNode result = null, curr = null, tmp = null; while (left != null && right != null) { if (left.val < right.val) { curr = left; left = left.next; } else { curr = right; right = right.next; } if (result == null) { result = curr; tmp = curr; } else { tmp.next = curr; tmp = tmp.next; } } if (left != null) tmp.next = left; if (right != null) tmp.next = right; return result; }
Subscribe to:
Posts (Atom)