package com.interview.books.svinterview; import com.interview.utils.ArrayUtil; /** * Created_By: stefanie * Date: 14-12-5 * Time: 下午7:18 */ public class SV6_SmallestSubsetSumLargerThanK { public int find(int[] array, int K){ int low = 0; int high = array.length - 1; while(low < high){ int[] partition = partition(array, low, high); if(partition[1] <= K){ high = partition[0]; } else { low = partition[0] + 1; } } int sum = 0; for(int i = array.length - 1; i >= high; i--) sum += array[i]; return sum > K? high : high - 1; } private int[] partition(int[] array, int low, int high){ int pivot = low; int sum = 0; for(int j = low + 1; j <= high; j++){ if(array[j] < array[low]) ArrayUtil.swap(array, ++pivot, j); else sum += array[j]; } ArrayUtil.swap(array, pivot, low); sum += array[pivot]; return new int[]{pivot, sum}; } // // // public static int find(int[] array, int K){ // return find(array, K, 0, array.length - 1); // } // // public static int find(int[] array, int K, int low, int high){ // if(low > high) return -1; // int pivot = low; // int sum = 0; // for(int j = low + 1; j <= high; j++){ // if(array[j] > array[low]) { // sum += array[j]; // ArrayUtil.swap(array, ++pivot, j); // } // } // ArrayUtil.swap(array, pivot, low); // sum += array[pivot]; // if(sum < K) return find(array, K - sum, pivot + 1, high); // else { // int index = find(array, K, low, pivot - 1); // return index != -1 ? index : pivot; // } // } public static void main(String[] args){ SV6_SmallestSubsetSumLargerThanK finder = new SV6_SmallestSubsetSumLargerThanK(); int[] array = new int[]{5,2,1,7,3,4,9}; int index = finder.find(array, 18); for(int i = array.length - 1; i >= index; i--) System.out.print(array[i] + " "); System.out.println(); index = finder.find(array, 10); for(int i = array.length - 1; i >= index; i--) System.out.print(array[i] + " "); } }