Leetcode 第179场周赛小结

5352. 生成每种字符都是奇数个的字符串

给你一个整数 n,请你返回一个含 n 个字符的字符串,其中每种字符在该字符串中都恰好出现 奇数次 

返回的字符串必须只含小写英文字母。如果存在多个满足题目要求的字符串,则返回其中任意一个即可。

题解:奇数全填某个字符,偶数先填n-1个字符再填一个不同的字符就可以了。

5353. 灯泡开关 III

 题解:顺序遍历题目给的开灯序列。定义两个指针,pos,max_open。pos指向的位置以及其之前的位置所有的灯都是开着的,max_open指向到目前为止,所有开着的灯的最大序号。

pos==max_open的时候,灯的颜色就可以变成蓝色。

AC代码:

  int numTimesAllBlue(vector<int>& light) {
        int Len = light.size();
        int flag[Len+10];
        for(int i = 0;i<=Len;i++) flag[i] = 0;
        int pos = 0;
        int ans= 0;
        int max_open = 0;
        for(int i =0;i<Len;i++)
        {
            max_open = max(max_open,light[i]);
            flag[light[i]] = 1;
            while(pos+1 <= Len && flag[pos+1] == 1) pos++;
            // updata pos
            if(pos >= max_open) ans++;
        }
        return ans;
    }

5354.  通知所有员工所需的时间

题解:根据manager数组建树,建好之后BFS,队列存节点和花费的时间。最终结果为所有能到达的叶子节点的最大花费。

AC代码:

int numOfMinutes(int n, int headID, vector<int>& manager, vector<int>& informTime) {
        int Len = manager.size();
        vector<int> edge[Len+10];
        int ans = INT_MIN;
        for(int i=0;i<Len;i++)
        {
            if(manager[i] == -1) continue;
            edge[manager[i]].push_back(i);
        }
        typedef pair<int,int> pii;
        queue<pii> que;
        que.push(make_pair(headID,0));
        while(!que.empty())
        {
            pii now = que.front();
            que.pop();
            int now_id = now.first;
            ans = max(ans,now.second);
            for(int i=0;i<edge[now_id].size();i++)
            {
                int cost = now.second+informTime[now_id];
                que.push(make_pair(edge[now_id][i],cost));   
            }
        }
        return ans;
    }

5355.  T秒后青蛙的位置

题解:根据无向边建图,建图BFS更新概率。有两个点要注意:

1. 在更新到target点的时候,此时的层数小于t秒。如果target点不是叶子节点,那么t秒的时候青蛙无法在target点。  

2. 梳理清楚BFS层数和时间T的关系(可能这段时间玩太多了,比赛的时候不是很专注,这里WA了好几发)

AC代码:

double frogPosition(int n, vector<vector<int>>& edges, int t, int target) {
        vector<int> edge[110];
        int Len = edges.size();
        double dp[110];
       
        int vis[110];
        for(int i=0;i<=100;i++) 
        {
            vis[i] = 0;
            dp[i] = 0.00;
        }
        for(int i=0;i<Len;i++)
        {
            edge[edges[i][0]].push_back(edges[i][1]);
            edge[edges[i][1]].push_back(edges[i][0]);
        }
        typedef pair<int,int> pii;
        queue<pii> que;
        que.push(make_pair(1,0));
        vis[1] = 1;
        dp[1] = 1.0000000;
        while(!que.empty())
        {
            pii now = que.front();
            que.pop();
           // cout << now.second <<endl;
            if(now.second >= t) break;
            int now_id = now.first;
            int Len = edge[now_id].size();
            int tmp_Len = 0;
            
            //ava leaf node
            for(int i=0;i<Len;i++) if(vis[edge[now_id][i]] == 0) tmp_Len++;
            // if(now_id == target)
            // {
            //     cout << now.second <<" " << tmp_Len << endl;
            // }
            if(now_id == target && now.second < t && tmp_Len != 0) return 0.0;
            for(int i=0;i<Len;i++)
            {
                if(vis[edge[now_id][i]] == 1) continue;
                vis[edge[now_id][i]] = 1;
                dp[edge[now_id][i]] = dp[now_id] * (1.0/(tmp_Len*1.0));
                que.push(make_pair(edge[now_id][i],now.second+1));
            }
        }
        cout << dp[target] << endl;
        return dp[target];
    }

一些感想:

近来状态确实不佳,也算开始调整了。

和室友聊了一聊,得知了他在家里的学习状态以及他周赛的成绩,反观自己,连基础题写的bug也有不少,写的时候注意力也不是很集中,也很容易想一些其他的事情。

想了想,我这一个时间段能做好的事情不多,也该压一压学习了。之前一天也就看个四五个小时的书,室友看8-9个小时,周赛打的不如意也正常,写的太少了平时写的时候也不能说

写的很专注,这点一定得改。平时都不够专注,别指望比赛的时候能够有多专注。

图和数据结构的一些算法也确实挺久没有复习了,所有写起来的时候磕磕绊绊的。后面的一周除了补一些题目之外,可以有针对的去写这方面的题目~

好了吃饭去了,稳定的阶段性收获是坚持的最大动力,浪费这么久时间了,也该有一个学生的样子了,愿不负韶华。

原文地址:https://www.cnblogs.com/z1141000271/p/12441945.html