插入排序:
思路:
设长度 n , 计数器 i
1.每次扩增一个数字 i++,往该数字的前面依次做比较 如果小于 前面的数则交换
2.外层循环终止条件 i == n
3.内层循环终止条件 j < 0 || nums[j] >= nums[j - 1];
最差状况下 时间复杂度 O(N ^ 2)
最优情况下 O(N);
时间复杂度取最差情况下;
二分排序:
O(log2N)
1.升序找值
2.升序找边界
3.局部最小最大(二分不一定要有序
两个方向入手
1.数据状况
2.问题标准
常规情况下在升序数组中做二分
局部最大值:
162. 寻找峰值
难点:1.如何二分?
//left 与 right 代表左边界与右边界
思路:1.局部最大值 性质: nums[left] > nums[left + 1] left为局部最大值 此时 left ~ left + 1 呈现下降趋势
反之呈现上升趋势
2. nums[right] > nums[right - 1] right 为局部最大值 right - 1 ~ right 呈现下降趋势 反之 呈现上升趋势
3.在 1 2 均不成立 即 当前 nums[left] 与nums[right] 都不是局部最大值时
可得 left ~ left + 1 升序 right ~right -1 升序
所以 left ~ right 之间必存在一个峰值 也就是left与right的交汇点
4.建立在 3 基础上 取mid值 (mid = (left + right) / 2)
若 nums[mid - 1] < nums[mid] && nums[mid] >nums[mid + 1] 那么nums[mid] 就是峰值
若 nums[mid] 不是峰值,可分以下几种情况:
1)nums[mid - 1] > nums[mid]
mid ~ mid - 1 之间呈现上升趋势
缩小right边界
2)nums[mid] < nums[mid + 1]
mid ~ mid + 1 之间呈现上升趋势
扩大left边界
ps:这里有个分歧点 当 nums[mid] < nums[mid - 1] 与 nums[mid] < nums[mid + 1] 同时成立 根据代码选择可以选择 1 或 2 情况下 都对。
