新农上路
- 积分
- 99
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2019-5-28
- 最后登录
- 1970-1-1
|
调一个all permutation 就可以了
在 base case 里面做一些文章而已 为了少一点参数,全部global了。
理解意思就好。
关于时间复杂度,因为只要找到就可以提前终止 recursion 了, 这里没写,在base case里只要find,throw exception 的方式终止。类似 break loop。
- public class FindSmallestPermutationK {
- int num;
- int lowerBound;
- int res;
- boolean find;
- public int findSmallPer(int num, int lowerBound) {
- this.num = num;
- this.lowerBound = lowerBound;
- this.res = Integer.MIN_VALUE;
- this.find = false;
- char[] array = Integer.toString(num).toCharArray();
- Arrays.sort(array);
- allPermutation(array, 0, array.length);
- return res;
- }
- private void allPermutation(char[] array, int index, int n) {
- if (index == n) {
- int cur = Integer.parseInt(new String(array));
- if (!find && cur > num && cur > lowerBound) {
- res = cur;
- find = true;
- }
- return;
- }
- for (int i = index; i < n; i++) {
- swap(array, i, index);
- allPermutation(array, index + 1, n);
- swap(array, i, index);
- }
- }
- private void swap(char[] array, int a, int b) {
- char temp = array[a];
- array[a] = array[b];
- array[b] = temp;
- }
- public static void main(String[] args) {
- FindSmallestPermutationK sol = new FindSmallestPermutationK();
- System.out.println(sol.findSmallPer(4319, 200));
- System.out.println(sol.findSmallPer(123, 100));
- System.out.println(sol.findSmallPer(123, 911));
- System.out.println(sol.findSmallPer(12378, 12456));
- System.out.println(sol.findSmallPer(12345, 12678));
- // System.out.println(sol.findSmallPer(123, 911));
- }
- }
复制代码 [/b][/b] |
|