leetcode刷题记录-day11

255

在这里插入图片描述
1.有一说一,大厂考察的次数很少,题目也非常简单,就dfs就完事儿了,还记的之前的那个简单的版本么?直接给你一颗二叉树,这里完全可以根据前序遍历构造出来。

259

在这里插入图片描述
1.大厂考察的次数非常少,僵硬。
2.思路其实就非常简单,就直接先排序,然后固定第一个指针,接着让第二个指针指向后一个,第三个指针指向末尾,然后让第三个指针向前移动,直到满足和小于target,然后第二个指针向前移动,判断一下第三个指针是否需要向前移动;最后俩人相碰,结束一次循环,然后让第一个指针后移。这就妥妥的O(n2)时间复杂度。
3.如何去重呢?其实很简单,就是比如对于外部循环,下一次不要去上一次去过的地方。内部循环也是如此。当然,对于首尾指针是否可以相同,这是自然可以。
4.思路简单,pass!

260

在这里插入图片描述
1.这道题目做的人数突然就多了起来,且考察的大厂也多了起来,我本来还很激动,后来仔细一看,淦,这不就是之前做过的题目么。
2.思路自己再想一遍吧,我不想说了,pass!

261

在这里插入图片描述
1.考察的也不是很多,不过思路还是很清晰的,就是判断一个无向图有几个环路呗。
2.哈哈哈,我有点不会啊,卧槽。顺带着把有向图判断是否有环的方法也复习一遍。
3.其实还是很简单的,有向图和无向图的判断方法都可以用入度表来搞。
首先维护一个入度表vector,然后再维护一个出边图,之后开始找,有没有入度为0的,有的话,这就是个独立的点,count+1;然后找一下有没有入度=1的,有的话,就将这个点涉及到的其他点的入度-1.完了以后呢,再继续遍历vector,继续找下一个入度=1的点,直到遍历完成。
4.另外提供一个思路:对于无向图(假设是强联通分量),如果是树,则边数=点数-1,否则就是图!!!这个方法还不错。
5.再提供一个bfs的思路。这个思路对于无向图而言,就是维护一个visited数组,然后邻接表就这样子:当检查完了一个A-》B的关系后,直接把这个关系给删除掉,同时还要删除B->A的关系,就很棒。而对于有向图,其实也可以,就都挺不错的,访问完了就把关系删除掉,双向关系就删除双向。

264

在这里插入图片描述
1.这道题考察的次数不是特别多,但是题目短小精干,确实是个好题目。
2.思路太毒了!!!我是真的想不到,这道题解法是:维护三个指针。后面的咱就不多说了,自己想吧,pass

267

在这里插入图片描述
1.这道题出现频率也很低,可能是因为这道题非常简单吧。
2.思路的话,直接就先找奇数的那个,然后如果奇数出现次数超过1,那就返回空吧。剩下的就是相当于排列前面的一半,要考虑重复。这就很简单了,先排序,然后dfs,记住,遇到相同的就跳过。

277

在这里插入图片描述
1.微软考察的次数不是很多,这道题的思路还是蛮简单的。
2.将所有人想象成一个序列,然后从第一个人和第二个人开始访问,俩人互相询问是否认识对方,那么就四种可能:
互相认识,则俩人都不可能是名人,直接更换成下两个;
相互不认识,则俩人也都不可能是名人,因为名人要被所有人都认识。直接更换成下两个;
俩人只有一个人认识另一个人,另一个人不认识前面这个人。OK,这个呆子就可能是名人,把另外一个人淘汰,继续更新一个人,继续。
最后最多只能有一个疑似名人产生,再遍历一遍看看大家是否都认识它,而它是否都不认识所有人。
3.pass!

279

在这里插入图片描述
1.这道题的考察次数还是蛮多的。
2.思路其实是很简单的,就直接dp就完事儿了,你细想想。

280

在这里插入图片描述
1.这道题微软考察的次数还行,不算少;
2.我拒绝做这么弱智的题目,淦(就分析嘛,肯定第i个和第i-1个如果是应该满足大于的关系,那么如果事实上不满足的话,交换即可,不会对前面产生影响啊,就这?)

281

在这里插入图片描述
1.这道题是弱智吧,肯定不会考察啊,爷吐了。

284

在这里插入图片描述
1.又是tmd一个zz题目,简单到爆炸,难受,pass!

285

在这里插入图片描述
1.微软考察的次数还行,4+吧
2.这道题也还可以,值的动动脑子。这道题的坑其实就在于,不只是这个p节点的右孩子出发,还有可能存在于它的父辈中。
3.对于这种情况的处理其实也很简单,就直接沿着root节点开始走,一定一定能找到p,那么在找的路上更新最小值就完事儿了。
放代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
        TreeNode* ans = nullptr;
        int Max = INT_MAX;
        if(root == nullptr || p == nullptr)
            return ans;
        for(TreeNode* curNode = root; curNode != nullptr; ) {
            if(curNode != p) {
                if(curNode->val > p->val) {
                    if(curNode->val < Max) {
                        Max = curNode->val;
                        ans = curNode;
                    }
                    curNode = curNode->left;
                }
                else
                    curNode = curNode->right;
            } else {
                curNode = curNode->right;
            }
        }
        return ans;
    }
};

286

在这里插入图片描述
1.这道题考察的次数还行,偏少吧。
2.我个人觉得这道题非常棒!表面上看,这道题是找出所有的门,然后对每一个门进行bfs遍历(需要先将原本的图信息复制出来,因为会污染到)。
3.实质上,这道题的解法是,将所有的门坐标,全部放到一个queue中,然后直接bfs,就在此点的基础上进行染色。(当然,大家肯定会打架,避免的方法是,如果对方是-1,就放弃;如果对方的index比这次咱们要生成的x+1要小,那也放过;否则就污染!)
4.评论区说,这是多源bfs,这个做法是真的棒!!!

287

在这里插入图片描述
1.这可是个正儿八经的好题目,考察次数特别多!
2.位运算,不能再提示了。(记得,人家说重复,可没说这个数只重复一次)

289

在这里插入图片描述
1.考察次数一般吧,不过这真的是个非常棒的题目。
2.我的想法其实很简单,就还是位运算,bit0表示现在的,然后bit1表示变化之后的,O(n2)的时间复杂度是跑不了的。(感觉这样有点投机取巧)

294

在这里插入图片描述
1.个人真心觉得这是一道非常棒的题目,可惜考察的公司不多。
2.一开始我真的没啥思路,其实就是个递归。这个递归函数是这样的:判断此次翻转的人是否可以必胜。假设此次这个人有3种翻转的可能,那么只要满足:对于随意的一种可能,对方必败。那么此次翻转的人就必胜。那么问题就来到了,啥叫必败呢?就是对于每一手选择,对方都一定能获胜。
3.请问,对于每一种选择,难道真的只存在必胜和必败两种状态么?难道就不能存在一种,可能胜出,也可能输的状态么?朋友,大家都是尽全力获胜,从策略上就决定了只要有可能,就一定会选择直接杀死对手的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值