leetcode-5942:找出 3 位偶数

简介: leetcode-5942:找出 3 位偶数

题目

题目链接

给你一个整数数组 digits ,其中每个元素是一个数字(0 - 9)。数组中可能存在重复元素。

你需要找出 所有 满足下述条件且 互不相同 的整数:

  • 该整数由 digits 中的三个元素按 任意 顺序 依次连接 组成。
  • 该整数不含 前导零
  • 该整数是一个 偶数

例如,给定的 digits 是 [1, 2, 3] ,整数 132 和 312 满足上面列出的全部条件。

将找出的所有互不相同的整数按 递增顺序 排列,并以数组形式返回。

示例 1:

输入:digits = [2,1,3,0]
输出:[102,120,130,132,210,230,302,310,312,320]
解释:
所有满足题目条件的整数都在输出数组中列出。 
注意,答案数组中不含有 奇数 或带 前导零 的整数。

示例 2:

输入:digits = [2,2,8,8,2]
输出:[222,228,282,288,822,828,882]
解释:
同样的数字(0 - 9)在构造整数时可以重复多次,重复次数最多与其在 digits 中出现的次数一样。 
在这个例子中,数字 8 在构造 288、828 和 882 时都重复了两次。 

示例 3:

输入:digits = [3,7,5]
输出:[]
解释:
使用给定的 digits 无法构造偶数。

示例 4:

输入:digits = [0,2,0,0]
输出:[200]
解释:
唯一一个不含 前导零 且满足全部条件的整数是 200 。

示例 5:

输入:digits = [0,0,0]
输出:[]
解释:
构造的所有整数都会有 前导零 。因此,不存在满足题目条件的整数。

解题

方法一:回溯

总共只有3位数,因此可以使用枚举,来限定每个 位的 数的集合

并且需要横向去重,用一个used数组

用isValid来判断每个位的有效性

backtracing形参中,num代表当前的 数(比如遍历了120,那么num=120),k代表第k个数

class Solution {
public:
    unordered_set<int> setLeft={1,2,3,4,5,6,7,8,9};
    unordered_set<int> setMid={0,1,2,3,4,5,6,7,8,9};
    unordered_set<int> setRight={0,2,4,6,8};
    vector<int> res;
    void backtracing(vector<int>& digits,vector<bool>& used,int num,int k){
        if(k==3){
            res.push_back(num);
            return;
        }
        for(int i=0;i<digits.size();i++){
            if(i>0&&digits[i]==digits[i-1]&&used[i-1]==false) continue;
            if(used[i]==false&&isValid(digits,i,k)){
                used[i]=true;
                num=num*10+digits[i];
                backtracing(digits,used,num,k+1);
                num/=10;
                used[i]=false;
            }
        }
    }
    bool isValid(vector<int>& digits,int i,int k){
        if(k==0&&setLeft.count(digits[i])) return true;
        if(k==1&&setMid.count(digits[i])) return true;
        if(k==2&&setRight.count(digits[i])) return true;
        return false;
    }
    vector<int> findEvenNumbers(vector<int>& digits) {
        sort(digits.begin(),digits.end());
        int n=digits.size();
        vector<bool> used(n,false);
        backtracing(digits,used,0,0);
        return res;
    }
};


相关文章
|
23天前
LeetCode[题解] 2864. 最大二进制奇数
LeetCode[题解] 2864. 最大二进制奇数
12 0
|
23天前
|
C++ Python
leetcode-167:两数之和 II - 输入有序数组
leetcode-167:两数之和 II - 输入有序数组
30 0
|
23天前
|
Java
leetcode-47:全排列 II
leetcode-47:全排列 II
22 0
|
23天前
求100以内偶数之和
求100以内偶数之和
27 0
|
8月前
|
算法
OJ题库:奇偶数排序(使奇数全部都位于偶数前面)
OJ题库:奇偶数排序(使奇数全部都位于偶数前面)
38 0
|
11月前
LeetCode: 167. 两数之和 II - 输入有序数组 | 双指针专题
LeetCode: 167. 两数之和 II - 输入有序数组 | 双指针专题
48 1
|
12月前
|
机器学习/深度学习 算法 安全
LeetCode - #47 全排列 II
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
算法 Java
判断回文串(hdu 2029)双指针法
题目来自 hdu 杭州电子科技大学的一个算法网站
LeetCode 167.两数之和 II - 输入有序数组
LeetCode 167.两数之和 II - 输入有序数组
46 0
LeetCode 1502. 判断能否形成等差数列
如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。
82 0

热门文章

最新文章