日期:2026年9月11日
LeetCode 題目連結:3483. Unique 3-Digit Even Numbers
解題想法
簡單題,題目給一個包含正整數或零的陣列 $digits$,從 $digits$ 之中取出 $3$ 個數字組合成沒有前導零 $3$ 位數的偶數,回傳這樣的數總共有幾種組合。這是我一開始的寫法是用三層 for 迴圈從 $digits$ 之中取數字,最外層的 for 迴圈跑第一位 $x$,如果取出的數字為 $0$ 就跳過;第二層的 for 迴圈跑第二位 $y$,這個位數沒有限制;最內層的 for 迴圈跑第三位 $z$,這個位數只能是偶數。將 $100 x + 10 y + z$ 存入集合 $ans$ 之中,答案為 $ans$ 的長度。因為題目只有 $3$ 位數,這個寫法的速度還算快。
另一個寫法是用三層 for 迴圈枚舉所有的 $3$ 位數偶數,計算這個偶數需要的數字數量,如果 $digits$ 之中可以提併足夠的數字,就將答案 $ans$ 數量加 1。
Python 程式碼
使用集合。Runtime: 15 ms, beats 69.45%. Memory: 19.21 MB, beats 72.53%.
class Solution:
def totalNumbers(self, digits: List[int]) -> int:
n = len(digits)
ans = set()
for i in range(n):
x = digits[i]
if x == 0: continue
for j in range(n):
if i == j: continue
y = digits[j]
for k in range(n):
if k == i or k == j: continue
z = digits[k]
if z % 2 == 0:
ans.add(x*100 + y*10 + z)
return len(ans)
字典計數。Runtime: 412 ms, beats 7.47%. Memory: 19.28 MB, beats 72.53%.
class Solution:
def totalNumbers(self, digits: List[int]) -> int:
cnt = Counter(digits) # 各種數字的數量
ans = 0 # 答案
# 枚舉所有不含前導 0、3 位數的偶數
for i in range(1, 10): # 1 ~ 9
for j in range(10): # 0 ~ 9
for k in range(0, 10, 2): # 2, 4, 6, 8
need = Counter([i, j, k]) # 需要的數字數量
# digits 之中有足夠的數字,答案加 1
if need[i] <= cnt[i] and need[j] <= cnt[j] and need[k] <= cnt[k]:
ans += 1
return ans
表格計數。Runtime: 75 ms, beats 21.10%. Memory: 19.20 MB, beats 92.09%.
class Solution:
def totalNumbers(self, digits: List[int]) -> int:
cnt = [0] * 10 # 各種數字的數量
for digit in digits:
cnt[digit] += 1
ans = 0 # 答案
# 枚舉所有不含前導 0、3 位數的偶數
for i in range(1, 10): # 1 ~ 9
for j in range(10): # 0 ~ 9
for k in range(0, 10, 2): # 2, 4, 6, 8
need = [0] * 10 # 需要的數字數量
need[i] += 1
need[j] += 1
need[k] += 1
# digits 之中有足夠的數字,答案加 1
if need[i] <= cnt[i] and need[j] <= cnt[j] and need[k] <= cnt[k]:
ans += 1
return ans
C++ 程式碼
使用集合。Runtime: 5 ms, beats 72.70%. Memory: 30.96 MB, beats 51.66%.
class Solution {
public:
int totalNumbers(vector<int>& digits) {
unordered_set<int> ans;
int n = (int)digits.size();
for(int i = 0; i < n; i++) {
int x = digits[i];
if (x == 0) continue;
for(int j = 0; j < n; j++) {
if (i == j) continue;
int y = digits[j];
for(int k = 0; k < n; k++) {
if (k == i || k == j) continue;
int z = digits[k];
if (z % 2 == 0) {
ans.insert(x*100 + y*10 + z);
}
}
}
}
return ans.size();
}
};
表格計數。Runtime: 1 ms, beats 86.61%. Memory: 28.66 MB, beats 93.75%.
class Solution {
public:
int totalNumbers(vector<int>& digits) {
int cnt[10] = {0};
for(int digit : digits) cnt[digit]++;
int ans = 0;
for(int i = 1; i <= 9; i++) {
for(int j = 0; j <= 9; j++) {
for(int k = 0; k <= 8; k += 2) {
int need[10] = {0};
need[i]++;
need[j]++;
need[k]++;
if (cnt[i] >= need[i] && cnt[j] >= need[j] && cnt[k] >= need[k]) {
ans++;
}
}
}
}
return ans;
}
};
C 語言程式碼
表格計數。Runtime: 3 ms, beats 42.86. Memory: 9.99 MB, beats 54.29%.
int totalNumbers(int* digits, int digitsSize) {
int cnt[10] = {0};
for(int i = 0; i < digitsSize; i++) {
cnt[digits[i]]++;
}
int ans = 0;
for(int i = 1; i <= 9; i++) {
for(int j = 0; j <= 9; j++) {
for(int k = 0; k <= 8; k += 2) {
int need[10] = {0};
need[i]++;
need[j]++;
need[k]++;
if (cnt[i] >= need[i] && cnt[j] >= need[j] && cnt[k] >= need[k]) {
ans++;
}
}
}
}
return ans;
}
沒有留言:
張貼留言