2025-09-10 学习日记

发布于 2025-09-10 12:00 1110 字 6 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. 需要教语言的最少人数leetcode.1733 关键词: 问题分析: 就是看互为朋友的人是否会相同的语言 只能教一种语言 求要教的人的最少数 核心思路 遍历朋友数组,看有哪些组的朋友需要被教,怎么比较,提前用数组记录每个人会哪些语言,在比较时只看第二个人会不会第一个人的语言,记录完后枚举所有可能的语言,再比较看谁要被教,记录最小的人数即为答案 思维扩展:如果是任意数量的语言...

今日学习记录

1. 需要教语言的最少人数leetcode.1733

关键词:枚举 哈希表 问题分析:

  1. 就是看互为朋友的人是否会相同的语言
  2. 只能教一种语言
  3. 求要教的人的最少数

核心思路

  1. 遍历朋友数组,看有哪些组的朋友需要被教,怎么比较,提前用数组记录每个人会哪些语言,在比较时只看第二个人会不会第一个人的语言,记录完后枚举所有可能的语言,再比较看谁要被教,记录最小的人数即为答案

思维扩展

这样更简单,就是遇到不同就加一

**最终代码:

int minimumTeachings(int n, vector<vector<int>>& languages, vector<vector<int>>& friendships) {

        //不就是谁会哪几种语言嘛

        int len = languages.size();

        vector arr(len,vector<bool>(n+1,false));

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

            for(int x:languages[i]){

                arr[i][x] = true;

            }

        }

        vector<pair<int,int>> temp;

        for(auto &d:friendships){

            int u = d[0]-1,v = d[1]-1;

            bool ok = false;

            for(int x:languages[u]){

                if(arr[v][x]){

                    ok = true;

                    break;

                }

            }

            if(!ok) temp.emplace_back(u,v);

        }

        int ans = len;

        for(int k=  1;k<=n;k++){

            unordered_set<int> st;

            for(auto [u,v]:temp){

                //要学习的人,而不是要学习的语言,因为如果两个人都不会,都要学习,而不是只一一个学

                if(!arr[u][k]) st.insert(u);

                if(!arr[v][k]) st.insert(v);

            }

            ans = min(ans,(int)st.size());

        }

        return ans;

    }

学到的点:

  1. 枚举技巧

2. 制作 m 束花所需的最少天数leetcode.1482

关键词:二分答案 问题分析:

  1. 要等 n 天后其中的一部分花才开,要收集 m 束花,每束花都要花园中的连续 k 个花制成

核心思路

  1. 如果从第一天开始看,每次增加花开的数量,但是要每次都去遍历数组查看是否能制成花,直接使用双指针做,实现比较简单,那我直接说让天数无限大,那么所有的花都开了,我可以放心去收集花,一定能做成 m 束花,可是我要找到最小的天数来收集,这里就可以发现单调关系了,天数越小花越少,符合答案就越少,天数越大,花开的越多符合答案就越多,找到单调关系直接使用二分答案
  2. 双指针求分组长度为 m 的总数
  3. 特判
    ,直接返回-1

最终代码:

int minDays(vector<int>& bloomDay, int m, int k) {

        int n = bloomDay.size();

        if(n<(long long)m*k) return -1;

        auto check = [&](int mid)->bool{

            int ans = 0;

            for(int l = 0;l<n;l++){

                int sum = 0;

                for(int r = l;r<l+k&&r<n;r++){

                    if(mid<bloomDay[r]){

                        l = r;

                        break;

                    }

                    sum++;

                    if(sum==k){

                        ans++;

                        if(ans>=m) return true;

                        l = r;

                        break;

                    }

                }

            }

            return false;

        };

        int left = 0,right = 1e9;

        while(left<right){

            int mid = left+(right-left)/2;

            if(check(mid)) right = mid;

            else left = mid+1;

        }

        return right;

    }

学到的点: 1.


今日收获

  1. 待加强

  2. 明日计划:

    • [ ]
    • [ ]

执笔 手写

随机文章

加载中...