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