目录
案例一:给定无序数组arr,已知任意相邻的两个元素,值都不重复,请返回一个局部最小的位置。
案例四:给定一个有序整型数组arr,其中不含有重复元素,请找到满足arr[i]=i条件的最左的位置。如果所有位置上的树都不满足条件,返回-1。
案例五:给定一棵完全二叉树的头结点head,返回这棵树的节点个数。如果完全二叉树的节点数为N,实现时间复杂度低于O(N)的算法。
二分搜索常见的应用场景
1.在有序序列中查找一个数,时间复杂度为O(logN)
2.并不一定非要在有序序列中才能应用。
(在任意序列中,每次能够淘汰掉一半,只剩下另一半,这种情况都可以用二分搜索处理)
二分搜索常见题目的变化
1.给定处理或者查找对象的不同(有重复值和无重复值)
2.判断条件不同(=,>=)
3.返回的内容不同(任意一个满足条件的元素的位置,最左位置,最右位置,元素的个数)
在有序循环数组中进行二分搜索
重要提醒:
mid=(low+high)/2,当low,high数值很大的时候,可能会发生溢出
更安全的写法:mid=low+(high-low)/2
案例一:给定无序数组arr,已知任意相邻的两个元素,值都不重复,请返回一个局部最小的位置。
局部最小的概念:
1.对于0位置的元素,如果arr[0]<arr[1],位置0为局部最小的位置
2.对于N-1位置的元素,如果arr[N-1]<arr[N-2],位置N-1为局部最小的位置
3.对于非0,N-1位置的元素,如果arr[i]小于左右两侧的元素(arr[i-1],arr[i+1]),位置i为局部最小的元素
答案:
最优解的时间复杂度为O(logN),
1.arr为空或者长度为0,表示局部最小位置不存在
2.arr长度为1,返回0,表示0为局部最小的位置
3.arr长度大于1
考察arr[0]和arr[N-1]位置是否满足,
a.满足直接返回对应位置
b.不满足,说明arr[0]>arr[1],从位置0到1,趋势是递减的,arr[N-1]>arr[N-2],从位置N-1到N-2,趋势是递减的
再考察arr[mid]位置的元素是否满足。