第33题:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。来源:力扣(LeetCode)
1、由于时间复杂度只能是log(n),所以使用二分法;
由于数组被旋转了,所以其中并不是升序排序的;
但是也可以和二分法一样,数组分成两部分,其中肯定有一部分是升序的,然后在升序的那部分判断target是否可能存在这一部分;
可能的话就在这一部分进行下一步二分,如果不能就在另一部分进行下一步二分;
最终得出结果。
第34题:
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。来源:力扣(LeetCode)
1、可以先求出target的开始位置,因为nums是升序的,所以我们再求target+1的开始位置;
如果nums中不包含target+1,它的下标也会是target的结束位置+1;
所以只需要求到这两个值就可以得出target的开始和结束位置。
2、或者二分查找target,然后从nums内的这个数的下标开始取寻找它的开始位置和结束位置,分别用二分查找来实现。
寻找开始位置first 寻找结束位置last
得到了开始位置和结束位置后就返回结果。