leetcode267周赛


巨大的打击啊,一个半小时才做了一道题,做题期间还那么烦,心不静,想那些没用的东西,有太多无用的想法分散了注意力!
心不静导致第二题根本抓不到细节,提交->错误->修改->提交,循环往复,根本没什么效率,第二题按自己的方法细节很多,却根本静不下心;
向第二题这种,不能烦,越烦越做不下去,再烦也要做啊,真正的考试或比赛,烦了就不做了???都19了,连这点胸怀都没有?连这点耐心都没有?
你努力?努力个p!总是容易冲动,静下来好好做事,累了就休息下,硬撑后烦了,又想做,陷入恶性循环。。。愚蠢至极!!!
写代码多有意思!攻克一个又一个难题多么有成就感!这就像打游戏过了一关又想过下一关,多么有意思!你为什么会出现烦躁情绪 ?
昨晚不是刚看完电影? 还不够放松? 可以了兄弟!放下自己不成熟,冲动的态度,稳重一点,放下那些根本不重要的情绪和心情,放下那些根本没有意义的东西,专注于 提升自己,
专注于让自己一步一步地升级,然后去闯关,最后越来越高,享受那些成就感,不爽吗?!!!要学会正向激励自己,正向激励!!!
而不是那种貌似感天动地,貌似很悲壮的自律,那是自欺欺人!!! 欣赏成就感,是最舒服的自慰!!!
冲,攻克一个有一个的难题,去享受成绩感,去提升自己,让自己做什么事情,面对任何挑战都能够游刃有余!!!
当然心理精力解决了,的确会出现大脑精力和体力精力的缺失,大脑精力缺失就睡觉,听轻松音乐,体力精力缺失就吃饭,吃水果!!!
-------------废话截止--------------------------
My silly code:

//https://leetcode-cn.com/problems/reverse-nodes-in-even-length-groups/
#include
using namespace std;

//Definition for singly-linked list.
struct ListNode {
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};

class Solution {
public:
    ListNode* reverseEvenLengthGroups(ListNode* head) {
        ListNode* fmr=head,* p=head,*q=head->next;
        int i=1,k=1;
        while (1){
            if (i==k*(k+1)/2){
                int cont=0;
                ListNode* tmp=q;
                while (tmp!=NULL && cont!=k+1){
                    cont++;
                    tmp=tmp->next;
                }
                if (k&1 && cont&1) break;
                if ((k&1)==0 && cont && (cont&1)==0) {
                    tmp=fmr->next;
                    tmp->next=q;
                    fmr->next=p;
                    fmr=tmp;
                    p=q;
                    q=q->next;
                    ++i;
                    k+=2;
                    continue;
                }
            }
            if (i==k*(k+1)/2+1) ++k;
            if (k&1){
                if (i==k*(k+1)/2) fmr=p;
                if (q==NULL) break;
                p=q;q=q->next;i++;
            }
            else{
                ListNode* tmp;
                if (i==k*(k+1)/2 || q==NULL){
                    tmp=fmr->next;
                    tmp->next=q;
                    fmr->next=p;
                    if (q==NULL) break;
                    p=q;
                    q=q->next;++i;
                }
                else{
                    tmp=q->next;
                    q->next=p;
                    p=q;
                    q=tmp;
                    ++i;
                }
            }
            
        }
        return head;
    }
};

Conclusion:
1. Details are often in the connecting nodes
2. pay attention to the beginning and the end circumstances
3. pay attention to the change of some important value

第四题考察并查集,记得大一好像学过,但这时候就忘了,为啥子?没有领悟出其中精妙的算法思想,仅仅是看懂了算法的步骤而已,不过是浅层次阅读而已!
tutorial

自己写的模版(好吧,其实这根本不是模版,没有泛型编程。。。)

#ifndef _UNION_FIND
#define _UNION_FIND
class UnionFind{
    private:
        int* fa;
        int* rank;
    public:
        UnionFind(int maxbd){
            fa=new int[maxbd+1];
            rank=new int[maxbd+1];
            for (int i=0;i

领悟:

并查集最核心的思想便是将根节点作为代表,去处理不同集合之间的关系,进行合并和查询;
而下面的这一题就是利用了这种思想,赋予根节点多了一个功能--判断有限制的集合不能融合

267周赛第四题

my_ac_code

class Solution {
private:
    int* fa;
    int* rank;

public:
    void init(int maxbd){
        fa=new int[maxbd+1];
        rank=new int[maxbd+1];
        for (int i=0;i friendRequests(int n, vector>& restrictions, vector>& requests) {
        vector ans;
        init(n);
        int rst[n][n];
        memset(rst,0,sizeof(rst));
        int rstnum=(int)restrictions.size();
        for (int i=0;i