2025-11-16 学习日记

发布于 2025-11-16 12:00 629 字 4 min read 手写 每个字都是我自己敲的。

2025-12-24 学习日记2025-12-17 学习日记2025-12-14 学习日记2025-12-09 学习日记2025-12-08 学习日记2025-12-07 学习日记2025-12-06 学习日记2025-12-05 学习日记2025-12-04 学习日记2025-12-03 学习日记2025-12-02 学习日记2025-12-01 学习日记2025-11-30 学习日记2025-11-29 学习日记2025-11-28 学习日记2025-11-27 学习日记2025-11-26 学习日记2025-11-25 学习日记2025-11-24 学习日记2025-11-23 学习日记2025-11-22 学习日记2025-11-21 学习日记2025-11-20 学习日记2025-11-19 学习日记2025-11-18 学习日记2025-11-17 学习日记2025-11-16 学习日记2025-11-15 学习日记2025-11-14 学习日记2025-11-13 学习日记2025-11-12 学习日记2025-11-11 学习日记2025-11-10 学习日记2025-11-09 学习日记2025-11-08 学习日记2025-11-07 学习日记2025-11-06 学习日记2025-11-05 学习日记2025-11-04 学习日记2025-11-03 学习日记2025-11-02 学习日记2025-11-01 学习日记2025-10-31 学习日记2025-10-30 学习日记2025-10-29 学习日记2025-10-28 学习日记2025-10-27 学习日记2025-10-26 学习日记2025-10-25 学习日记2025-10-24 学习日记2025-10-23 学习日记2025-10-22 学习日记2025-10-21 学习日记2025-10-20 学习日记2025-10-19 学习日记2025-10-18 学习日记2025-10-17 学习日记2025-10-16 学习日记2025-10-15 学习日记2025-10-14 学习日记2025-10-13 学习日记2025-10-11 学习日记2025-10-10 学习日记2025-10-09 学习日记2025-10-03 学习日记2025-10-02 学习日记2025-10-01 学习日记2025-09-30 学习日记2025-09-29 学习日记2025-09-28 学习日记2025-09-27 学习日记2025-09-26 学习日记2025-09-25 学习日记2025-09-24 学习日记2025-09-23 学习日记2025-09-22 学习日记2025-09-21 学习日记2025-09-20 学习日记2025-09-18 学习日记2025-09-17 学习日记2025-09-16 学习日记2025-09-15 学习日记2025-09-14 学习日记2025-09-13 学习日记2025-09-12 学习日记2025-09-11 学习日记2025-09-10 学习日记2025-09-09 学习日记2025-09-08 学习日记2025-09-04 学习日记2025-09-03 学习日记2025-09-02 学习日记2025-09-01 学习日记2025-08-31 学习日记2025-08-29 学习日记2025-08-28 学习日记2025-08-27 学习日记2025-08-26 学习日记2025-08-25 学习日记2025-08-24 周记2025-08-23 学习日记2025-08-22 学习日记2025-08-21 学习日记2025-08-20 学习日记2025-08-19 学习日记2025-08-18 学习日记2025-08-17 周记2025-08-16 学习日记2025-08-15 学习日记2025-08-14 学习日记2025-08-13 学习日记2025-08-12 学习日记2025-08-11 学习日记
今日学习记录 1. 3747. 统计移除零后不同整数的数目 关键词: 问题分析: 题目给出一个 n,要求 1 到 n 中的没有 0 的不同数的个数,其中 核心思路: 可以直接一遍遍历,核心思想是直接构建数字,我们可以从小开始遍历观察 在一位时,有 1~9 可以选择,在二位时 10~99 时,当 10,20,30 出现时,就是 1,2,3,但是这些数字在一位时已经出现过了,所以在讨论二位的时候出现...

今日学习记录

1. 3747. 统计移除零后不同整数的数目

关键词:数位dp 数学 问题分析: 题目给出一个 n,要求 1 到 n 中的没有 0 的不同数的个数,其中1<=n<=10^15

核心思路:

数学

可以直接一遍遍历,核心思想是直接构建数字,我们可以从小开始遍历观察 在一位时,有 19 可以选择,在二位时 1099 时,当 10,20,30 出现时,就是 1,2,3,但是这些数字在一位时已经出现过了,所以在讨论二位的时候出现 0 就会降位,但是我们已经计算过了低位的数字,所以我们在讨论高位时就可以不考虑 0 了,即使用 19 的数构建二位数,这个数量不就是 9x9=81 吗,同理在三位,四位数中都是如此,开始时,设 pows 为 m 位-1 的 9 的组合 实现中,我们从高位开始遍历,当首位为 n 时,我们有 1n 个重复的选择,即n∗pow9n*pow9,每次选了之后把 pow9 除 9 代码:

class Solution {

public:

    long long countDistinct(long long n) {

        string s = to_string(n);

        int m = s.size();

        long long sum = pow(9,m);

        long long ans = (sum-9)/8;

        for(int i = 0;i<m;i++){

            char c = s[i];

            if(c=='0') break;

            int d = c-'1';

            if(i==m-1) d++;

            sum /= 9;

            ans += d*sum;

        }

        return ans;

    }

};

数位 dp

比赛时写不到 dp,干脆直接 dfs+记忆化

class Solution {

public:

    long long countDistinct(long long n) {

        string s = to_string(n);

        int len = s.length();

        vector arr(len,vector<long long>(2,-1));

        auto dfs = [&](this auto&&dfs,int p,bool flge,bool b)->long long{

            if(p == len) return b?1:0;

            if(arr[p][flge]!=-1) return arr[p][flge];

            int limit = flge?s[p] - '0':9;

            long long res=  0;

            if(!b) res += dfs(p+1,false,false);

            for(int i = 1;i<=limit;i++) res += dfs(p+1,flge&&(i==limit),true);

            if(b) arr[p][flge] = res;

            return res;

        };

        return dfs(0,true,false);

    }

};

学到的点:

  1. 数学
  2. 数位 dp

2. 3748. 统计稳定子数组的数目

关键词:前缀和 二分搜索

问题分析

核心思路

最终代码:

学到的点: 1.


执笔 手写

随机文章

加载中...