剑指 Offer 43. 1~n 整数中 1 出现的次数
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
示例 1:
输入:n = 12
输出:5
示例 2:输入:n = 13
输出:6限制:1 <= n < 2^31
直接上数位dp
class Solution {
public:
int a[40] , cnt = 0 , dp[40][40] ;
int dfs(int u , int num , int limit) {
if(u == cnt + 1) return num ;
if(!limit && dp[u][num] != -1) return dp[u][num] ;
int end = limit ? a[u] : 9 , ans = 0 ;
for(int i = 0 ;i <= end ;i ++ )
ans += dfs(u + 1 , num + (i == 1) , limit && i == end) ;
if(!limit) dp[u][num] = ans ;
return ans ;
}
int solve(int n) {
while(n) a[++ cnt] = n % 10 , n /= 10 ;
reverse(a + 1 , a + cnt + 1) ;
memset(dp , -1 , sizeof dp) ;
return dfs(1 , 0 , 1) ;
}
int countDigitOne(int n) {
return solve(n) ;
}
};
每次做题提醒自己:题目到底有没有读懂,有没有分析彻底、算法够不够贪心、暴力够不够优雅。