You are given an integer array digits
, where each element is a digit. The array may contain duplicates.
You need to find all the unique integers that follow the given requirements:
- The integer consists of the concatenation of three elements from
digits
in any arbitrary order. - The integer does not have leading zeros.
- The integer is even.
For example, if the given digits
were [1, 2, 3]
, integers 132
and 312
follow the requirements.
Return a sorted array of the unique integers.
Example 1:
Input: digits = [2,1,3,0] Output: [102,120,130,132,210,230,302,310,312,320] Explanation: All the possible integers that follow the requirements are in the output array. Notice that there are no odd integers or integers with leading zeros.
Example 2:
Input: digits = [2,2,8,8,2] Output: [222,228,282,288,822,828,882] Explanation: The same digit can be used as many times as it appears in digits In this example, the digit 8 is used twice each time in 288, 828, and 882.
Example 3:
Input: digits = [3,7,5] Output: [] Explanation: No even integers can be formed using the given digits.
Example 4:
Input: digits = [0,2,0,0] Output: [200] Explanation: The only valid integer that can be formed with three digits and no leading zeros is 200.
Example 5:
Input: digits = [0,0,0] Output: [] Explanation: All the integers that can be formed have leading zeros. Thus, there are no valid integers.
Constraints:
3 <= digits.length <= 100
0 <= digits[i] <= 9
思路:backtracking + 选代表去重复;
class Solution {
public int[] findEvenNumbers(int[] digits) {
if(digits == null || digits.length == 0) {
return new int[0];
}
Arrays.sort(digits);
StringBuilder sb = new StringBuilder();
ArrayList<Integer> list = new ArrayList<>();
boolean[] visited = new boolean[digits.length];
dfs(digits, 0, sb, list, visited);
int[] res = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
private void dfs(int[] digits, int index, StringBuilder sb, ArrayList<Integer> list, boolean[] visited) {
if(sb.length() > 3) {
return;
}
if(sb.length() == 3 && isvalid(sb.toString())) {
int num = Integer.parseInt(sb.toString());
list.add(num);
return;
}
for(int i = 0; i < digits.length; i++) {
if(visited[i]) {
continue;
}
// 选代表去重复;
if(i > 0 && digits[i] == digits[i - 1] && !visited[i - 1]) {
continue;
}
sb.append(digits[i]);
visited[i] = true;
dfs(digits, i, sb, list, visited);
visited[i] = false;
sb.deleteCharAt(sb.length() - 1);
}
}
private boolean isvalid(String str) {
if(str.charAt(0) == '0') {
return false;
}
int num = Integer.parseInt(str);
return num % 2 == 0;
}
}