1. 程式人生 > >【LeetCode】967. Numbers With Same Consecutive Differences 解題報告(Python & C++)

【LeetCode】967. Numbers With Same Consecutive Differences 解題報告(Python & C++)

作者: 負雪明燭
id: fuxuemingzhu
個人部落格: http://fuxuemingzhu.cn/


目錄

題目地址:https://leetcode.com/problems/numbers-with-same-consecutive-differences/

題目描述

Return all non-negative integers of length N such that the absolute difference between every two consecutive digits is K

.

Note that every number in the answer must not have leading zeros except for the number 0 itself. For example, 01 has one leading zero and is invalid, but 0 is valid.

You may return the answer in any order.

Example 1:

Input: N = 3, K = 7
Output: [181,292,707,818,929]
Explanation: Note that 070 is not a valid number, because it has leading zeroes.

Example 2:

Input: N = 2, K = 1
Output: [10,12,21,23,32,34,43,45,54,56,65,67,76,78,87,89,98]

Note:

  1. 1 <= N <= 9
  2. 0 <= K <= 9

題目大意

找出N位數中,所有滿足每個數字的所有連續數相減絕對值等於K的數字。比如第一個例子的181就滿足|8-1| = |1 - 8| = 7.

解題方法

DFS

明顯這是個找出所有符合條件的題目,因此是個搜尋題。看了給出的數字的範圍只有9位數,大概判斷使用DFS不會超時。因此,我們使用DFS找出所有符合條件的即可。

這裡的DFS搜尋方法是,我們先確定首位數字是1到9,然後計算以這個數字開頭的整數滿足條件的有多少。也就是末位數字 + K <= 9 或者末位數字 + K >= 0兩種符合條件,可以繼續向後搜尋,知道搜尋到N==0,那麼搜尋結束,把現在的整數放到結果裡即可。

題目裡面有兩個坑:第一,先導0的問題,我在上面搜尋的過程中是假設了第一位數字不是0了,那麼對於N>=2的時候是滿足的,當N==1的時候直接返回0~9各個數字即可,這點題目沒有說清楚,我覺得是不好的。第二,題目沒有專門提到返回的數字不能有重複,我覺得題目應該提醒一下。

python程式碼如下:

class Solution(object):
    def numsSameConsecDiff(self, N, K):
        """
        :type N: int
        :type K: int
        :rtype: List[int]
        """
        if N == 1:
            return [0, 1,2,3,4,5,6,7,8,9]
        res = []
        for i in range(1, 10):
            self.dfs(res, i, N - 1, K)
        return list(set(res))
        
    def dfs(self, res, curint, N, K):
        if N == 0:
            res.append(curint)
            return
        last = curint % 10
        if last + K <= 9:
            self.dfs(res, curint * 10 + last + K, N - 1, K)
        if last - K >= 0:
            self.dfs(res, curint * 10 + last - K, N - 1, K)

用C++再寫了一遍的時候,對去重的處理時當K不等於0的時候再向更小的數字搜尋,因為K等於0的搜尋已經在last + K <=9中完成了。C++程式碼如下:

class Solution {
public:
    vector<int> numsSameConsecDiff(int N, int K) {
        if (N == 1)
            return {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        vector<int> res;
        for (int i = 1; i <= 9; i++)
            helper(res, i, N - 1, K);
        return res;
    }
    void helper(vector<int>& res, int curint, int N, int K) {
        if (N == 0) {
            res.push_back(curint);
            return;
        }
        int last = curint % 10;
        if (last + K <= 9)
            helper(res, curint * 10 + last + K, N - 1, K);
        if (last - K >= 0 && K)
            helper(res, curint * 10 + last - K, N - 1, K);
    }
};

日期

2018 年 12 月 30 日 —— 周賽差強人意