raghuvanshraj

nums_repeated_digits

Oct 1st, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.32 KB | None | 0 0
  1. class Solution {
  2. public:
  3.     int get_nos(int len) {
  4.         int all_nos[9];
  5.         int unique_nos[9];
  6.         for (int i = 0; i < len; ++i) {
  7.             all_nos[i] = 0;
  8.             unique_nos[i] = 0;
  9.         }
  10.  
  11.         all_nos[1] = 9;
  12.         all_nos[2] = 90;
  13.         unique_nos[1] = 9;
  14.         unique_nos[2] = 81;
  15.         for (int i = 3; i < len; ++i) {
  16.             all_nos[i] = all_nos[i-1] * 10;
  17.             unique_nos[i] = (i <= 10) ? unique_nos[i-1] * (10 - (i-1)) : 0;
  18.         }
  19.  
  20.         return accumulate(all_nos, all_nos + len, 0) - accumulate(unique_nos, unique_nos + len, 0);
  21.     }
  22.    
  23.     int numDupDigitsAtMostN(int n) {
  24.         vector<int> digits;
  25.         int temp = n;
  26.         while (temp) {
  27.             digits.push_back(temp % 10);
  28.             temp /= 10;
  29.         }
  30.  
  31.         while (digits[digits.size()-1] == 0) {
  32.             digits.pop_back();
  33.         }
  34.  
  35.         reverse(digits.begin(), digits.end());
  36.  
  37.         int len = digits.size();
  38.  
  39.         int dp[len+1];
  40.         for (int i = 0; i < len+1; ++i) {
  41.             dp[i] = 0;
  42.         }
  43.  
  44.         bool flag = false;
  45.         bool visited[10];
  46.         for (int i = 0; i < 10; ++i) {
  47.             visited[i] = false;
  48.         }
  49.  
  50.         for (int i = 1; i < min(10, len)+1; ++i) {
  51.             if (i == 1)  {
  52.                 dp[i] = digits[i-1];
  53.             } else {
  54.                 if (flag) {
  55.                     dp[i] = dp[i-1] * max(10 - (i-1), 0);
  56.                 } else {
  57.                     dp[i] = (dp[i-1] - 1) * max(10 - (i-1), 0);
  58.                     int count = digits[i-1] + 1;
  59.                     for (int j = 0; j < min(10, digits[i-1]+1); ++j) {
  60.                         if (visited[j]) {
  61.                             count--;
  62.                         }
  63.  
  64.                         if (count == 0) {
  65.                             break;
  66.                         }
  67.                     }
  68.  
  69.                     dp[i] += count;
  70.                 }
  71.             }
  72.  
  73.             if (visited[digits[i-1]]) {
  74.                 flag = true;
  75.             } else {
  76.                 visited[digits[i-1]] = true;
  77.             }
  78.         }
  79.  
  80.         int all_len_nos = n - (int)pow(10, len-1) + 1;
  81.         int n_ans = all_len_nos - dp[len];
  82.         int lesser_nos = this->get_nos(len);
  83.         int ans = lesser_nos + n_ans;
  84.  
  85.         return ans;
  86.     }
  87. };
Add Comment
Please, Sign In to add comment