算法
稻草人0.0
一个农村大学生在大城市迷茫的流浪着...
展开
-
树上的BFS(Tree Breadth First Search)
Pattern: Tree Breadth First Search,树上的BFS介绍来自链接:https://www.zhihu.com/question/36738189/answer/908664455 作者:穷码农 这种模式基于宽度优先搜索(Breadth First Search (BFS)),适用于需要遍历一颗树。借助于队列数据结构,从而能保证树的节点按照他们的层数打印出来。打印完当前层所有元素,才能执行到下一层。所有这种需要遍历树且需要一层一层遍历的问题,都能用这种模式高效解决。原创 2020-12-22 16:12:56 · 1225 阅读 · 0 评论 -
链表翻转(In-place Reversal of a LinkedList)
Pattern: In-place Reversal of a LinkedList,链表翻转介绍部分来自:https://www.zhihu.com/question/36738189/answer/908664455 作者:穷码农在众多问题中,题目可能需要你去翻转链表中某一段的节点。通常,要求都是你得原地翻转,就是重复使用这些已经建好的节点,而不使用额外的空间。这个时候,原地翻转模式就要发挥威力了。这种模式每次就翻转一个节点。一般需要用到多个变量,一个变量指向头结点(下图中的current),另外原创 2020-12-19 22:15:47 · 316 阅读 · 2 评论 -
Java创建和打印特殊数据结构的函数
1、leetcode 的 ListNode 的数据结构ListNode 的节点:/* Definition for singly-linked list. */public class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}用于创建建 ListNode 的函数:public ListNode init(int[] a){ ListNode head = new ListNo原创 2020-12-19 15:45:45 · 131 阅读 · 2 评论 -
循环排序(Cyclic Sort)
Pattern: Cyclic Sort,循环排序介绍部分来自:https://www.zhihu.com/question/36738189/answer/908664455 作者:穷码农这种模式讲述的是一直很好玩的方法:可以用来处理数组中的数值限定在一定的区间的问题。这种模式一个个遍历数组中的元素,如果当前这个数它不在其应该在的位置的话,咱们就把它和它应该在的那个位置上的数交换一下。你可以尝试将该数放到其正确的位置上,但这复杂度就会是O(n^2)。这样的话,可能就不是最优解了。因此循环排序的优势就原创 2020-12-18 21:53:33 · 2238 阅读 · 1 评论 -
区间合并类型(Merge Intervals)
Pattern: Merge Intervals,区间合并类型介绍部分来源: 链接:https://www.zhihu.com/question/36738189/answer/908664455 作者:穷码农区间合并模式是一个用来处理有区间重叠的很高效的技术。在设计到区间的很多问题中,通常咱们需要要么判断是否有重叠,要么合并区间,如果他们重叠的话。这个模式是这么起作用的:给两个区间,一个是a,另外一个是b。别小看就两个区间,他们之间的关系能跑出来6种情况。详细的就看图啦。理解和识别这六种情况,原创 2020-12-18 11:27:37 · 507 阅读 · 0 评论 -
快慢指针类型(Fast & Slow pointers)
Pattern: Fast & Slow pointers, 快慢指针类型以下来自:链接:https://www.zhihu.com/question/36738189/answer/908664455 作者:穷码农这种模式,有一个非常出门的名字,叫龟兔赛跑。 咱们肯定都知道龟兔赛跑啦。但还是再解释一下快慢指针:这种算法的两个指针的在数组上(或是链表上,序列上)的移动速度不一样。还别说,这种方法在解决有环的链表和数组时特别有用。通过控制指针不同的移动速度(比如在环形链表上),这种算法证明了他原创 2020-12-16 22:24:41 · 631 阅读 · 0 评论 -
双指针类型(two points)
Pattern: two points, 双指针类型以下来自:https://www.zhihu.com/question/36738189/answer/908664455双指针是这样的模式:两个指针朝着左右方向移动(双指针分为同向双指针和异向双指针),直到他们有一个或是两个都满足某种条件。双指针通常用在排好序的数组或是链表中寻找对子。比如,你需要去比较数组中每个元素和其他元素的关系时,你就需要用到双指针了。我们需要双指针的原因是:如果你只用一个指针的话,你得来回跑才能在数组中找到你需要的答案。这一原创 2020-12-15 22:53:45 · 1067 阅读 · 0 评论 -
滑动窗口类型(Sliding window)
Sliding window,滑动窗口类型以下来自:https://www.zhihu.com/question/36738189/answer/908664455滑动窗口类型的题目经常是用来执行数组或是链表上某个区间(窗口)上的操作。比如找最长的全为1的子数组长度。滑动窗口一般从第一个元素开始,一直往右边一个一个元素挪动。当然了,根据题目要求,我们可能有固定窗口大小的情况,也有窗口的大小变化的情况。下面是一些我们用来判断我们可能需要上滑动窗口策略的方法:这个问题的输入是一些线性结构:比如链表呀原创 2020-12-14 17:04:16 · 2606 阅读 · 0 评论