class Solution {
public int bsearch(int[] a, int n, int val) {
return bsearchInternally(a, 0, n - 1, val);
}
private int bsearchInternally(int[] a, int low, int high, int value) {
if (low > high) {
return -1;
}
int mid = low + ((high - low) >> 1);
if (a[mid] == value) {
return mid;
}
if (a[mid] < value) {
return bsearchInternally(a, mid+1, high, value);
}
return bsearchInternally(a, low, mid-1, value);
}
}
非递归实现:
class Solution {
public int bsearch(int[] a, int n, int value) {
int low = 0, high = n - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (a[mid] == value) {
return mid;
}
if (a[mid] < value) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
}
def dfs(node, visited):
visited.add(node)
# process current node here
for next_node in node.children():
if not next_node in visited:
dfs(next_node, visited)
非递归代码:
def dfs(self, tree):
if tree.root is None:
return []
visited, stack = [], [tree.root]
while stack:
node = stack.pop()
visited.add(node)
process(node)
nodes = generate_related_nodes(node)
stack.push(nodes)
# other process work
广度优先搜索 BFS
非递归代码:
dfs bfs(tree, start, end):
queue = []
queue.append([start])
visited.add(start)
while queue:
node = queue.pop()
visited.add(node)
process(node)
nodes = generate_related_nodes(node)
queue.push(nodes)
# other processing work
回顾
算法
复杂度分析
复杂度分析就是用来分析算法执行效率与数据规模之间增长关系的方法。
Big O notation:
从时间复杂度的分析情况可以区分为:
以上三种情况在大多数情况不需要区分,只要求出一个复杂度就足矣。只有在同一块代码在不同情况下,出现数量级的差别,才会具体进行区别分析。
常见到的空间复杂度:
递归
使用递归算法解决问题的三个条件:
模板公式:
避免递归过程中重复计算:
分治
分治和递归之间的区别:
分治每一层的递归都涉及3种操作:
模板公式:
分治算法能解决的问题,一般需要满足的条件:
二分查找
二分的时间复杂度是O(logn)。
二分查找中最简单的情况,在有序数组中不存在重复元素,找到给定值。可以通过递归和非递归来实现:
递归实现:
非递归实现:
二分查找应用场景的局限性
遍历和搜索
树的定义
节点之间的关系
树中的相似概念
树的遍历
深度优先搜索 DFS
非递归代码:
广度优先搜索 BFS
非递归代码:
动态规划
动态规划的大部分问题都能够通过回溯算法来解决,但是时间复杂度会是指数级的。而动态规划的效率会高很多,采用的是一种空间换时间的算法思想。
概念
案例:斐波那契数列
案例:Count the Path
数据结构
数组
从数组存储的内存模型上看,"下标"最确切的定义是偏移offset。如果a表示数组的首地址,a[0]就是偏移位0的位置,也就是首地址,如果用1开始计数,每次随机访问就多了一次减法运算,对CPU来说就多了一条减法指令。
链表
public ArrayStack(int n) { this.datas = new Object[n]; this.n = n; }
public boolean push(Object data) { if (count == n) { return false; }
}
public Object pop() { if (count == 0) { return null; }
} }
图
感受
感性角度
整一个月,线上线下的学习过程,我觉得很充实,也很幸福。
理性角度
我觉得参加这个训练营,有如下的几点收获:
目标
课程虽然结束了,没有了课程安排中制定的任务计划,但希望这一个月来的这种不断push自己的感觉不会流失。
所以我给自己制定了2个小目标:
结尾
在这里,我想摘抄一句个人最喜欢的作家和哲学家纳西姆·塔勒布的书《Skin in the Game》中的一句话:
为了能配得上自己想要获得的,坚持吧!努力吧!