// 算法流程详见dfs函数,设数字n有m位,arr长度为n,时间复杂度O(m*n)
public int max(int n, int[] arr) {
Arrays.sort(arr);
String value = String.valueOf(n);
char[] chars = value.toCharArray();
int[] nums = new int[chars.length];
for (int i = 0; i < nums.length; i++) {
nums[i] = Integer.parseInt(String.valueOf(chars[i]));
}
return dfs(arr, nums, true, 0);
}
/**
*
* @param arr
* @param nums
* @param preEq 前一个位置取值是否等于nums[index]
* @param index 当前考虑index位置
* @return 返回最大的组合值
*/
public int dfs(int[] arr, int[] nums, boolean preEq, int index) {
if (index == nums.length) {
return 0;
}
if (preEq) {
// 条件1.index位置的取值必须满足arr[i] <= nums[index]
for (int i = arr.length - 1; i >= 0; i--) {
if (arr[i] <= nums[index]) {
//贪心策略:有等于的数字优先取等于,没有的话取小于
int i1 = (int) (arr[i] * Math.pow(10, nums.length - index - 1) + dfs(arr, nums, arr[i] == nums[index], index + 1));
if (i1 == -1 && arr[i] == nums[index]) {
continue;
}
return (int) (arr[i] * Math.pow(10, nums.length - index - 1) + dfs(arr, nums, arr[i] == nums[index], index + 1));
}
}
if (index == 0) {
// 第一个没有满足小于等于的条件,舍弃第一位
return dfs(arr, nums, false, index + 1);
}
return -1;
} else {
return (int) (arr[arr.length - 1] * Math.pow(10, nums.length - index - 1) + dfs(arr, nums, false, index + 1));
}
}
字节面试题:给定数字n,数组arr={1,3,5,2},求arr中的数字能组成小于n的最大整数
最新推荐文章于 2024-04-10 10:49:24 发布