Welcome to Subscribe On Youtube

1215. Stepping Numbers

Description

A stepping number is an integer such that all of its adjacent digits have an absolute difference of exactly 1.

  • For example, 321 is a stepping number while 421 is not.

Given two integers low and high, return a sorted list of all the stepping numbers in the inclusive range [low, high].

 

Example 1:

Input: low = 0, high = 21
Output: [0,1,2,3,4,5,6,7,8,9,10,12,21]

Example 2:

Input: low = 10, high = 15
Output: [10,12]

 

Constraints:

  • 0 <= low <= high <= 2 * 109

Solutions

Solution 1: BFS

First, if $low$ is $0$, we need to add $0$ to the answer.

Next, we create a queue $q$ and add $1 \sim 9$ to the queue. Then, we repeatedly take out elements from the queue. Let the current element be $v$. If $v$ is greater than $high$, we stop searching. If $v$ is in the range $[low, high]$, we add $v$ to the answer. Then, we need to record the last digit of $v$ as $x$. If $x \gt 0$, we add $v \times 10 + x - 1$ to the queue. If $x \lt 9$, we add $v \times 10 + x + 1$ to the queue. Repeat the above steps until the queue is empty.

The time complexity is $O(10 \times 2^{\log M})$, and the space complexity is $O(2^{\log M})$, where $M$ is the number of digits in $high$.

  • class Solution {
        public List<Integer> countSteppingNumbers(int low, int high) {
            List<Integer> ans = new ArrayList<>();
            if (low == 0) {
                ans.add(0);
            }
            Deque<Long> q = new ArrayDeque<>();
            for (long i = 1; i < 10; ++i) {
                q.offer(i);
            }
            while (!q.isEmpty()) {
                long v = q.pollFirst();
                if (v > high) {
                    break;
                }
                if (v >= low) {
                    ans.add((int) v);
                }
                int x = (int) v % 10;
                if (x > 0) {
                    q.offer(v * 10 + x - 1);
                }
                if (x < 9) {
                    q.offer(v * 10 + x + 1);
                }
            }
            return ans;
        }
    }
    
  • class Solution {
    public:
        vector<int> countSteppingNumbers(int low, int high) {
            vector<int> ans;
            if (low == 0) {
                ans.push_back(0);
            }
            queue<long long> q;
            for (int i = 1; i < 10; ++i) {
                q.push(i);
            }
            while (!q.empty()) {
                long long v = q.front();
                q.pop();
                if (v > high) {
                    break;
                }
                if (v >= low) {
                    ans.push_back(v);
                }
                int x = v % 10;
                if (x > 0) {
                    q.push(v * 10 + x - 1);
                }
                if (x < 9) {
                    q.push(v * 10 + x + 1);
                }
            }
            return ans;
        }
    };
    
  • class Solution:
        def countSteppingNumbers(self, low: int, high: int) -> List[int]:
            ans = []
            if low == 0:
                ans.append(0)
            q = deque(range(1, 10))
            while q:
                v = q.popleft()
                if v > high:
                    break
                if v >= low:
                    ans.append(v)
                x = v % 10
                if x:
                    q.append(v * 10 + x - 1)
                if x < 9:
                    q.append(v * 10 + x + 1)
            return ans
    
    
  • func countSteppingNumbers(low int, high int) []int {
    	ans := []int{}
    	if low == 0 {
    		ans = append(ans, 0)
    	}
    	q := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
    	for len(q) > 0 {
    		v := q[0]
    		q = q[1:]
    		if v > high {
    			break
    		}
    		if v >= low {
    			ans = append(ans, v)
    		}
    		x := v % 10
    		if x > 0 {
    			q = append(q, v*10+x-1)
    		}
    		if x < 9 {
    			q = append(q, v*10+x+1)
    		}
    	}
    	return ans
    }
    
  • function countSteppingNumbers(low: number, high: number): number[] {
        const ans: number[] = [];
        if (low === 0) {
            ans.push(0);
        }
        const q: number[] = [];
        for (let i = 1; i < 10; ++i) {
            q.push(i);
        }
        while (q.length) {
            const v = q.shift()!;
            if (v > high) {
                break;
            }
            if (v >= low) {
                ans.push(v);
            }
            const x = v % 10;
            if (x > 0) {
                q.push(v * 10 + x - 1);
            }
            if (x < 9) {
                q.push(v * 10 + x + 1);
            }
        }
        return ans;
    }
    
    

All Problems

All Solutions