左神算法课笔记(一)

我们常说,程序=算法+数据结构。结果光搞框架去了,有点说不过去~

时间复杂度

常数时间的操作:如果一个操作的执行时间不以具体样本为转移,每次执行时间都是固定时间。称这样的操作为常数时间操作。
数组的寻址操作就是固定时间操作,与数据量无关。

>>带符号右移
左神算法课笔记(一)
>>>不带符号右移
左神算法课笔记(一)
常数时间的操作包括:
左神算法课笔记(一)
非常数时间操作包括:
链表获取i位置的元素
左神算法课笔记(一)

选择排序

在0~n-1位置中找到最小值,和0位置的数交换
找1~n-1位置最小值,和1位置的数交换

直到n-1~n-1,不用操作了

整个流程中常数操作的数量:
左神算法课笔记(一)
我们最终是要将低阶项和高阶项的系数抹掉的。

左神算法课笔记(一)
左神算法课笔记(一)
左神算法课笔记(一)
左神算法课笔记(一)
注意
左神算法课笔记(一)
左神算法课笔记(一)
左神算法课笔记(一)
左神算法课笔记(一)
左神算法课笔记(一)
左神算法课笔记(一)
左神算法课笔记(一)
左神算法课笔记(一)
左神算法课笔记(一)
左神算法课笔记(一)
左神算法课笔记(一)
一个常用的小技巧
1、两数相加除以2的时候,为了避免溢出,应该先除以2,再相加
2、右移一位>>比除以2的运算更快
3、除以2加1相当于先右移再进行或1| 1
左神算法课笔记(一)
必须保证两个数在两个独立的空间,否则自己异或自己结果为0。这只是一个骚操作,面试的时候可能或问到,实际上你写的时候不要这么得瑟,因为容易有坑。
问题1
如何在不使用新变量的情况下,交换两个数?
左神算法课笔记(一)
异或运算和异或的顺序无关
下面这道题,将所有的数全部异或即可
左神算法课笔记(一)
左神算法课笔记(一)
左神算法课笔记(一)
左神算法课笔记(一)
左神算法课笔记(一)
在eor中找最右侧的1,这个最右侧的1可以将a,b两个数区分开。整个数组中,我们根据eor最右侧1这个位置,将数组分为两部分,其中一部分一定包含a,另一部分一定包含b。然后再分别对这两部分进行整体的异或操作即可。
左神算法课笔记(一)