题目描述

原题链接

整数数组 nums 按升序排列,数组中的值 互不相同 。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。
给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

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

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

示例 3:
输入:nums = [1], target = 0
输出:-1

提示:

  • 1 <= nums.length <= 5000
  • -10^4 <= nums[i] <= 10^4
  • nums 中的每个值都 独一无二
  • 题目数据保证 nums 在预先未知的某个下标上进行了旋转
  • -10^4 <= target <= 10^4

进阶:你可以设计一个时间复杂度为 O(log n) 的解决方案吗?

个人解法

Javascript

直接使用JavaScript的语法糖
太暴力了,但是这个其实不是让我们这么做的
直接去看其他解法

  1. /**
  2. * @param {number[]} nums
  3. * @param {number} target
  4. * @return {number}
  5. */
  6. var search = function (nums, target) {
  7. return nums.indexOf(target);
  8. };

Java(二分查找)

  1. class Solution {
  2. public int search(int[] nums, int target) {
  3. int left = 0, len = nums.length, right = len - 1, index = -1, mid;
  4. if (target==nums[0]){
  5. return 0;
  6. }else if (target==nums[right]){
  7. return len-1;
  8. }
  9. if (nums[left]<=nums[right]){
  10. mid=-1;
  11. }else {
  12. while (true){
  13. mid = (left + right) / 2;
  14. if (nums[mid]>nums[mid+1]){
  15. break;
  16. }
  17. if (nums[mid]>nums[right]){
  18. left=mid;
  19. }else {
  20. right=mid;
  21. }
  22. }
  23. }
  24. if (mid==-1){
  25. left=0;
  26. right=len-1;
  27. }else if (target>nums[0]&&target<=nums[mid]){
  28. left=0;
  29. right=mid;
  30. }else {
  31. left=mid+1;
  32. right=len-1;
  33. }
  34. while (left<=right){
  35. mid=(left+right)/2;
  36. if (target==nums[mid]){
  37. return mid;
  38. }else if (target<nums[mid]){
  39. right=mid-1;
  40. }else {
  41. left=mid+1;
  42. }
  43. }
  44. return -1;
  45. }
  46. }

其他解法

Java

Javascript

二分查找

  1. /*
  2. * @lc app=leetcode.cn id=33 lang=javascript
  3. *
  4. * [33] 搜索旋转排序数组
  5. */
  6. // @lc code=start
  7. /**
  8. * @param {number[]} nums
  9. * @param {number} target
  10. * @return {number}
  11. */
  12. var search = function(nums, target) {
  13. // 时间复杂度:O(logn)
  14. // 空间复杂度:O(1)
  15. // [6,7,8,1,2,3,4,5]
  16. let start = 0;
  17. let end = nums.length - 1;
  18. while (start <= end) {
  19. const mid = start + ((end - start) >> 1);
  20. if (nums[mid] === target) return mid;
  21. if (nums[mid] >= nums[start]) {
  22. // [start, mid]有序
  23. // 在 [start, mid] 之间 找 target
  24. if (target >= nums[start] && target <= nums[mid]) {
  25. end = mid - 1;
  26. } else {
  27. //target 不在 [start, mid] 之间
  28. start = mid + 1;
  29. }
  30. } else {
  31. // [mid, end]有序
  32. // 在 [mid, end] 之间 找 target
  33. if (target >= nums[mid] && target <= nums[end]) {
  34. start = mid + 1;
  35. } else {
  36. // target 不在 [mid, end] 之间
  37. end = mid - 1;
  38. }
  39. }
  40. }
  41. return -1;
  42. };
  43. // @lc code=end