Day 46

第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

  

   得到了开始位置和结束位置后就返回结果。

原文地址:https://www.cnblogs.com/liang-yi-/p/13520796.html