背景知识:
1、常数时间操作(固定时间的操作):包含加减乘除运算以及寻址等。
int a 32位
int b 32位
a+b--->都是固定位数的数进行运算,所以是固定时间的操作。
寻址(连续结构) int[ ] nums; nums[14w];
这些都是常数时间操作。
一、评估算法好坏的核心指标是什么?
1、时间复杂度(流程决定)
假设数据量为N,执行完整个流程,常数时间的操作
2、额外空间复杂度(流程决定)
3、常数项时间(实现细节决定)
二、简单的算法题
1、排序算法
1.1选择排序
假设一个数组nums[]有N个数,那么其下标就是0~N-1.
算法思路:
1、在0~N-1范围内找到一个最小的数nums[min],将这个数与0位置的数交换。
2、在1~N-1范围内找到一个最小的数nums[min`],将这个数与1位置的数交换。
3、直到完全排序。
分析时间复杂度:(将算法流程分解到常数时间的操作)
1.2冒泡排序
1.3插入排序
算法思路
1、保证0~1上有序,1位置的数与0位置的比,谁大谁往右
2、保证0~2上有序,2位置的数与1位置的比,谁大谁往右。直到比到0位和满足左边小右边大。
2、二分法
二分法经常用来解决在一个有序数组上的二分搜索。
只要能构建左右两侧的淘汰逻辑,就可以使用二分法
要点:二分法的重点应该用 L+((R-L>>1)):防止长度越界,以及位运算速度快
注意二分法while中的条件,不同的判断条件就有不同的边界条件
2.1在一个有序数组中,找某个数是否存在
2.2在一个有序数组中,找>=某个数最左侧的位置(构建出左右两侧的淘汰逻辑,>=某个数的最左位置肯定会在中点的左边或者右边)
2.3在一个有序数组中,找<=某个数最右侧的位置
2.4局部最小值问题(局部最优解问题,可以在一边找到解,另一边可以不用管)
在一个无序数组中 ,这个数组的特点:值有可能正,有可能负,有可能零且任意两个相邻的数不相等
算法思路:
①任意相邻的两个数不相等:可以得出xy坐标系中斜率不为0
②边界条件:0位置的局部最小 [0]<[1] N-1位置的局部最小 [N-1]<[N-2]
③找局部最小:若0和N-1位置都不是局部最小,那这个函数就是先减后增,必存在局部最小,找谷底。