假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是 O(log n) 级别。

示例 1:

输入: nums = [4,5,6,7,0,1,2], target = 0

输出: 4

示例 2:

输入: nums = [4,5,6,7,0,1,2], target = 3

输出: -1

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这道题对我而言,最大的难点在于理解题目,多次理解错题目,真够憋屈。哎
其实,题目意思很简单:就是给定一个数组(这个数组本来是升序的,而且没有重复的元素,后来经过循环旋转后得到现在给定的这个数组),在数组中找到一个数字,如果找到的话,就返回下标,否则就返回-1。

我的解 - 二分法

  1. class Solution {
  2. public int search(int[] nums, int target) {
  3. int len = nums.length - 1;
  4. int left = 0;
  5. int right = len;
  6. while(right >= left){
  7. int mid = (right + left) / 2;
  8. if(nums[mid] == target) return mid;
  9. if(nums[mid] > nums[len]){
  10. if(target < nums[mid] && target > nums[len]) right = mid - 1;
  11. else left = mid + 1;
  12. }else{
  13. if(target > nums[mid] && target <= nums[len]) left = mid + 1;
  14. else right = mid - 1;
  15. }
  16. }
  17. return -1;
  18. }
  19. }

便于理解 - 啰嗦点-跟上面一样

  1. class Solution {
  2. public int search(int[] nums, int target) {
  3. int left = 0;
  4. int right = nums.length - 1;
  5. while(right >= left){
  6. int mid = (right + left) / 2;
  7. if(nums[mid] == target) return mid;
  8. if(nums[mid] > nums[nums.length - 1]){
  9. if(target < nums[mid]){
  10. if(target > nums[nums.length - 1]){
  11. right = mid - 1;
  12. }else{
  13. left = mid + 1;
  14. }
  15. }else{
  16. left = mid + 1;
  17. }
  18. }else{
  19. if(target > nums[mid]){
  20. if(target > nums[nums.length - 1]){
  21. right = mid - 1;
  22. }else{
  23. left = mid + 1;
  24. }
  25. }else{
  26. right = mid - 1;
  27. }
  28. }
  29. }
  30. return -1;
  31. }
  32. }