LC 967. Numbers With Same Consecutive Differences

Posted ethanhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LC 967. 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=1的特别情况,这个时候都行。

 

class Solution {
private:
  unordered_map<int,vector<int>> mp ;
public:
  vector<int> numsSameConsecDiff(int N, int K) {
    
    if(N == 1){
      vector<int> ret;
      for(int i=0; i<10; i++) ret.push_back(i);
      return ret;
    }
    for(int i=0; i<10; i++){
      int idx = i + K;
      if(idx < 10) mp[i].push_back(idx);
      idx = i - K;
      if(!mp[i].empty() && mp[i][0] == idx) continue;// K等于1特殊情况
      if(idx >= 0) mp[i].push_back(idx);
    }
    vector<int> ret;
    for(int i=1; i<10; i++){
      if(!mp.count(i)) continue;
      helper(ret, N, i, 0);
    }
    return ret;
  }
  void helper(vector<int>& ret, int N, int start, int tmpval){
    int tt = tmpval*10 + start;
    if(to_string(tt).size() == N) {
      ret.push_back(tt);
      return;
    }
    if(!mp.count(start)) return ;
    vector<int> choices = mp[start];
    for(auto x : choices){
      helper(ret, N, x, tt);
    }
  }
};

 

再贴一个yubowen大佬的解法

 

typedef long long ll;
typedef vector<int> VI;
typedef pair<int,int> PII;

#define REP(i,s,t) for(int i=(s);i<(t);i++)
#define FILL(x,v) memset(x,v,sizeof(x))

const int INF = (int)1E9;
#define MAXN 100005


class Solution {
public:
  int N, K;
  void solve(int i, int ld, int val, VI &ans) {
    if (i == N) {
      ans.push_back(val);
      return;
    }
    REP(t,0,2) {
      int d = t == 0 ? ld + K : ld - K;
      if (K == 0 && t == 1) continue;
      if (0 <= d && d <= 9) {
        solve(i+1, d, val*10 + d, ans);
      }
    }
  }
  vector<int> numsSameConsecDiff(int _N, int _K) {
    N = _N; K = _K;
    VI ans;
    if (N == 1) {
      REP(i,0,10) ans.push_back(i);
      return ans;
    }
    REP(s,1,10) solve(1, s, s, ans);
    return ans;
  }
};

 

以上是关于LC 967. Numbers With Same Consecutive Differences的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode-967 Numbers With Same Consecutive Differences(连续差相同的数字)

lc 805. Split Array With Same Average

[LC] 100. Same Tree

LC.02. Add Two Numbers

[LC] 165. Compare Version Numbers

[LC] 129. Sum Root to Leaf Numbers