【LeetCode】Biweekly Contest 10 总结

一、概述

做的很差劲,至少可以拿出半小时看第四题的,结果只ac了第一题和第三题。所以对自己很生气,要总结一下经验教训。

二、分析

1、第一题

输入三个有序数组,找相同元素。

我是个傻逼,为什么这么说呢?我第一眼看到这题,脑子里直接就想的是三个指针移动,有一个到末尾就退出。想的挺好,也是这么实施的。问题就出来了:如何让三个指针移动呢?这个逻辑怎么设计?需要想一会,我写到一半才开始想这个问题,边界条件有点多,就着急起来,怎么写都报错。就很蛋疼。

然后灵光一闪,想到可以两两比较,先找出前两个数组的相同元素,保存为tmp,然后找tmp和第三个数组的相同元素即可。三个指针不好弄,两个就简单多了,你比我大我往后,我比你大我往后。就很容易做出回来了。

我这题就想起来卡尔一套二十连结果被bkbPA一刀暴死,弄什么花里胡哨的东西啊,做出来就行嘛。

2、第二题

输入两个二分搜索树和一个值,若树中存在两个节点,和等于此值,返回true,否则返回false。

我是个大傻逼,为什么这么说呢?我第一眼看到这题,开始想二分搜索树是什么。二分搜索树一定左子树所有节点小于该节点值,右子树所有节点大于等于该节点值。成了,我就先让两节点相加,然后看大还是小,若是小,那就在看一个节点和另一个节点的左子树相加大还是小——DFS的思想,一个DFS包办。但是遇到最差情况:节点有序的二分搜索树,退化成链表了,然后tar又是最大的两个值相加,那我这时间复杂度为O(m*n),wdnmd,就一直报TLE。气死了。我就想,该怎么剪枝呢?我剪个屁枝,最极端情况根本没法剪枝,这无法避免,样例里有这个我铁定TLE。这方法从最开始就没得用。

另外我吐槽一下这个可视化:

这明明是一个正常的二叉树,根本不是BST。

实际上怎么做呢?先DFS第一棵树,保存所有节点值,然后DFS第二棵树,如果tar-第二棵树的元素在第一棵树的节点值集合中,返回true。这就完事了,时间复杂度O(max(m,n))。又简单又快,把我这花里胡哨的吊起来打。

3、第三题

输入上限high和下限low,输出之间的所有数,这些数满足如下特征:相邻位的数字之差的绝对值为1,比如说12、89、10101之类。

我是个特大傻逼,为什么这么说呢?第一时间我懵住了,然后开始在纸上画:1可以衍生出10和12,10衍生101,12衍生121和123,好像是这个规律。看起来像DFS,先1,10,101,1010,10101,直到比high大。DFS个屁,DFS没法保证有序啊,要有序得用BFS。而且事先做好准备:先把0~9入队,因为0可以引出1但是1没法引出2,1只能引出10和12;没注意这个我要蛋疼死了。

BFS我又纠结了,low最小是0,high最大两亿呢,这得多少数啊,我最开始可不可以不从0开始啊,从low开始?不行,low不一定满足要求,low不能入队。那写一个函数找到最小的大于low的满足条件的值?这得怎么写啊,看上去很麻烦。写个屁!首先从算法原理上来讲,这就是10棵不同的树,你准备工作就是生成这10棵树,你要是low=10000你从10101开始也没法找齐所有的数,这是其一;其二就是tm极限情况就是low=0high=两亿,你就得一个一个输出所有的,怕什么时间爆表,存在这种情况那就证明不能爆表,写就完事了。

4、第四题

第四题我题都没看我总结个毛线,但一想就是DP,DP我还没看,肯定做不出。

三、总结

从第一题里面,我可以知道大于2的情况若能化为等于2的情况结合,那么这种做法一定是最简单的,也就是结合律要灵活使用:a+b+c=a+(b+c);

从第二题里面,我可以知道要注意极限情况的讨论,注意自己算法在极限情况时的时间复杂度,极限情况一般没法剪枝,这个时间复杂度要是超了那就没辙;

从第三题里面,我可以知道极限情况的最少时间,与第二题相印证,第二题通过极限情况的最小时间复杂度推翻我的算法;第三题通过极限情况的最小时间复杂度支撑我的算法,总而言之,极限情况很重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值