算是算法感悟吧

如何判断一个过程中可能出现的环值?

采用hashset

快慢指针

一个指针遍历链表无法解决问题时

用两个指针。方式有可以让其中一个走的快一些,或其中一个先走若干步。

k= k/len一定要注意len的非0性

数组的构建

有时可以将要处理的数据集元素值作为数组的下标实现快速访问

如一个字符串“adfadsfsdfsdf"包含a-z的字母,求各个字母的出现次数

可以构建数组int[26]分别对应a,b,c……其他的例子还有好多

复杂度大的算法执行速度一定慢于复杂度小的吗?

扫描二维码关注公众号,回复: 4904844 查看本文章

取决于真是世界的数据规模。在大规模n的情况下,一般来讲复杂度小的会更快。

For certain test cases with not very large nnn, the runtime of this method can be slower than Approach #2. The reason is hash table has some overhead in maintaining its property. One should keep in mind that real world performance can be different from what the Big-O notation says. The Big-O notation only tells us that for sufficiently large input, one will be faster than the other. Therefore, when nnn is not sufficiently large, an O(n)O(n)O(n) algorithm can be slower than an O(nlog⁡n)O(n \log n)O(nlogn) algorithm.

链表

主要考察查询()、更改链表结构(融合,结构反转,删除等等)、查询并删除符合条件的值。

对链表的操作一般有遍历,反转,反向输出,找某项链表特性(如有环性,反复性等等)

删除某节点时不一定要从头到尾确定了它的位置在删除,也可以将下一个节点的值赋值至该处,之后删除下一个节点。

当使用一个指针需要遍历多遍才能得到结果或无法操作时,可以使用多个指针。当涉及到更改链表结构,比如指向时,一定要避免操作过程中丢失下一步索引问题的出现。

如对一个链表进行反转时,原顺序为1->2->3,需将其变成1<-2<-3。如果该改变2了,改变指向时需要将当前指针2指向前一个节点1,此时就要注意不能丢失节点3的索引。需用一个临时节点将3存储起来,之后的操作才能正常进行。

反转时的方法可以用递归与非递归两种形式。

递归形式:

流程可参考如下样式,将大问题化小,解决了小问题再一步步的形成大问题的解。

此处时从尾至头反转(蓝色为本来方向,橘色为处理后方向)

非递归形式:

从前向后一个个处理,注意边界值,下一个节点的存储即可。

猜你喜欢

转载自blog.csdn.net/better_girl/article/details/83620714