1 minute read

Problem Statement

leetcode problem link

Brute Force [TLE]

class Solution:
    def findEvenNumbers(self, digits: List[int]) -> List[int]:
        digits.sort(reverse=True)
        N = len(digits)
        res = []

        def convert_to_num(arr):
            ans = 0
            for x in arr:
                ans = ans * 10 + x
            return ans

        for i in range(N):
            for j in range(N):
                for k in range(N):
                    if i != j and j != k and i != k and digits[i] != 0:
                        curr = [digits[i], digits[j], digits[k]]
                        num = convert_to_num(curr)
                        if num % 2 == 0 and num not in res:
                            res.append(num)
                        curr.pop()
        return sorted(res)

My Approach after reading hints [Accepted]

class Solution:
    def findEvenNumbers(self, digits: List[int]) -> List[int]:
        valid_nums = set()
        digits_count = Counter(digits)
        res = []
        for x in range(100, 1000):
            if x % 2 == 0:
                valid_nums.add(x)

        for num in valid_nums:
            curr = defaultdict(int)
            temp = num
            while num > 0:
                d = num % 10
                curr[d] += 1
                num //= 10
            for x in curr:
                if x not in curr:
                    break
                if curr[x] > digits_count[x]:
                    break
            else:
                res.append(temp)
        return res

Editorial

Approach 1: Enumerate the Element Combinations in an Array

class Solution:
    def findEvenNumbers(self, digits: List[int]) -> List[int]:
        nums = set()  # Target even set
        n = len(digits)
        # Traverse the indices of three digits
        for i in range(n):
            for j in range(n):
                for k in range(n):
                    # Determine whether it meets the condition of the target even number
                    if i == j or j == k or i == k:
                        continue
                    num = digits[i] * 100 + digits[j] * 10 + digits[k]
                    if num >= 100 and num % 2 == 0:
                        nums.add(num)
        # Converted to an array sorted in ascending order
        res = sorted(list(nums))
        return res