算法课1

链表反转

准备三个指针,pre, head, next

循环队列

设置size和limit将putindex和pullindex的关系解耦掉.

Min栈

设置两个栈,Min栈保存当前栈的最小值

递归复杂度

若递归满足:\(T(N) = aT(\frac N b) + O(N^d)\), 记\(k = \log_b(a)\)

则:

  1. \(k > d\), 则复杂度为\(O(N^k)\)
  2. \(k < d\), 则复杂度为\(O(N^d)\)
  3. \(k == d\), 则复杂度为\(O(N^d*\log N)\)

归并排序本质理解

两个组归并,一个关键过程就是左组的元素遇到右组中第一个比他大的元素时败下阵,这时可以轻易算出右组有几个比他小或者比他大,也就是归并排序过程中可以算出:某个元素某侧比他大或小的元素。例如求逆序对或者顺序对。

快排理解

一个数组分三块:小于a,等于a,大于a。遍历数组,把小于a的扔左边,大于a的扔右边,具体实现就是当小于a,小于边界往右扩,然后和这个小的交换,,i++,当等于a时,i++,大于a时,大于边界往左扩,和这个大的交换,i不变,为什么,因为扩到的这个数还没看过。

void sort(vector<int>& v, int L, int R)
{
	if(L>=R) return;
	int i = L, l = L - 1, r = R + 1, tar = v[R];
	for(;i < r;)
	{
		if(v[i] == tar) ++i;
		else if(v[i] < tar)
		{
			swap(v[l+1], v[i]);
			++i, ++l;
		}
		else
		{
			swap(v[r-1], v[i]);
			--r;
		}
	}
	sort(v, L, l);
	sort(v, r, R);
}
posted @ 2022-02-18 14:46  hellozhangjz  阅读(48)  评论(0)    收藏  举报