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;
    }
};


相关文章
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
Leetcode题目"剑指 Offer 21. 调整数组顺序使奇数位于偶数前面"的两种Python解决方案,一种是使用双端队列调整数组顺序,另一种是使用双指针法将奇数移到数组前半部分,偶数移到后半部分。
29 4
|
7月前
剑指Offer LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面
剑指Offer LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面
45 0
|
算法
图解LeetCode——剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
图解LeetCode——剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
104 1
|
Python
Python|力扣周赛-统计位数为偶数的数字
Python|力扣周赛-统计位数为偶数的数字
93 0
|
Java Python
【LeetCode每日一题】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(持续更新)
【LeetCode每日一题】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(持续更新)
82 0
|
算法 PHP
力扣(LeetCode)算法题解:1295. 统计位数为偶数的数字
力扣(LeetCode)算法题解:1295. 统计位数为偶数的数字
118 0
LeetCode 1295. 统计位数为偶数的数字
LeetCode 1295. 统计位数为偶数的数字
|
算法 前端开发 程序员
「LeetCode」剑指Offer-21调整数组顺序使奇数位于偶数前面⚡️
「LeetCode」剑指Offer-21调整数组顺序使奇数位于偶数前面⚡️
95 0
「LeetCode」剑指Offer-21调整数组顺序使奇数位于偶数前面⚡️
[路飞]_leetcode-剑指 Offer 21-调整数组顺序使奇数位于偶数前面
leetcode-剑指 Offer 21-调整数组顺序使奇数位于偶数前面
LeetCode 2074. 反转偶数长度组的节点(链表)
LeetCode 2074. 反转偶数长度组的节点(链表)
257 0
LeetCode 2074. 反转偶数长度组的节点(链表)