โจทย์
Stepping Number คือจำนวนเต็มที่ตัวเลขติดกันทุกคู่มีความต่างสัมบูรณ์ = 1 (เช่น 321 ✓, 421 ✗) หา Stepping Numbers ทั้งหมดในช่วง [low, high] เรียงลำดับ
ตัวอย่าง: low=0, high=21 → [0,1,2,3,4,5,6,7,8,9,10,12,21]
แนวคิด: DFS สร้างตัวเลขแบบเพิ่มหลักท้ายทีละตัว
เริ่มจาก 0-9 สร้างต่อโดยเพิ่มหลักท้าย ±1 จากหลักสุดท้าย จนเกิน high
ขั้นตอน
- ฟังก์ชัน
solve(high, seed, len):- ถ้า
seed > high→ return - เพิ่ม
seedลงtemp - ถ้า
seed == 0→ เรียกsolve(high, i, 1)สำหรับ i=1..9 - มิฉะนั้น:
last = seed % 10- ถ้า
last >= 1 && len+1 <= 10→solve(high, seed*10 + last-1, len+1) - ถ้า
last <= 8 && len+1 <= 10→solve(high, seed*10 + last+1, len+1)
- ถ้า
- เรียก
solve(high, 0, 0) - เรียง
tempแล้วกรองเฉพาะ ≥ low
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<int> v) {
cout << "[";
for (int x : v) cout << x << ", ";
cout << "]" << endl;
}
class Solution {
vector<long long> temp;
void solve(int high, long long seed = 0, int len = 0) {
if (seed > high) return;
temp.push_back(seed);
if (seed == 0) {
for (int i = 1; i <= 9; i++) solve(high, i, 1);
} else {
int last = seed % 10;
if (last >= 1 && len + 1 <= 10) solve(high, seed * 10 + last - 1, len + 1);
if (last <= 8 && len + 1 <= 10) solve(high, seed * 10 + last + 1, len + 1);
}
}
public:
vector<int> countSteppingNumbers(int low, int high) {
solve(high);
sort(temp.begin(), temp.end());
vector<int> ans;
for (long long x : temp) if (x >= low) ans.push_back(x);
return ans;
}
};
int main() {
Solution ob;
print_vector(ob.countSteppingNumbers(0, 40));
return 0;
}
อินพุต / เอาต์พุต
Input: 0 40
Output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 21, 23, 32, 34]
ความซับซ้อน
- Time: O(จำนวน Stepping Numbers) - สร้างเฉพาะตัวเลขที่ถูกต้อง
- Space: O(จำนวน Stepping Numbers) - เก็บผลลัพธ์ชั่วคราว
ข้อสังเกต
จำกัดความยาว ≤ 10 หลัก เพราะ int สูงสุด ~2×10^9 (10 หลัก)