题目描述 整数数组 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 。
你必须设计一个时间复杂度为 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
示例 3:
输入:nums = [1], target = 0 输出:-1
提示:
1 <= nums.length <= 5000
$-10^4 <= nums[i] <= 10^4$
nums 中的每个值都 独一无二
题目数据保证 nums 在预先未知的某个下标上进行了旋转
$-10^4 <= target <= 10^4$
解决方法 C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class Solution {public : int search (vector<int >& nums, int target) { int left = 0 , right = nums.size () - 1 ; while (left <= right) { int mid = left + (right - left) / 2 ; if (nums[mid] == target) { return mid; } if (nums[left] <= nums[mid]) { if (nums[left] <= target && target <= nums[mid]) { right = mid - 1 ; } else { left = mid + 1 ; } } else { if (nums[mid] <= target && target <= nums[right]) { left = mid + 1 ; } else { right = mid - 1 ; } } } return -1 ; } };
结果 执行用时 : 3 ms, 击败 66.87% 使用 C++ 的用户
内存消耗 : 13.30 MB, 击败 5.05% 使用 C++ 的用户
Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class Solution { public int search (int [] nums, int target) { int left = 0 , right = nums.length - 1 ; while (left <= right) { int mid = left + (right - left) / 2 ; if (nums[mid] == target) { return mid; } if (nums[left] <= nums[mid]) { if (nums[left] <= target && target <= nums[mid]) { right = mid - 1 ; } else { left = mid + 1 ; } } else { if (nums[mid] <= target && target <= nums[right]) { left = mid + 1 ; } else { right = mid - 1 ; } } } return -1 ; } }
结果 执行用时 : 0 ms, 击败 100.00% 使用 Java 的用户
内存消耗 : 41.00 MB, 击败 19.74% 使用 Java 的用户
Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 class Solution (object ): def search (self, nums, target ): """ :type nums: List[int] :type target: int :rtype: int """ left, right = 0 , len (nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] == target: return mid if nums[left] <= nums[mid]: if nums[left] <= target <= nums[mid]: right = mid - 1 else : left = mid + 1 else : if nums[mid] <= target <= nums[right]: left = mid + 1 else : right = mid - 1 return -1
结果 执行用时 : 19 ms, 击败 52.22% 使用 Python 的用户
内存消耗 : 11.41 MB, 击败 100.00% 使用 Python 的用户
Python3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Solution : def search (self, nums: List [int ], target: int ) -> int : left, right = 0 , len (nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] == target: return mid if nums[left] <= nums[mid]: if nums[left] <= target <= nums[mid]: right = mid - 1 else : left = mid + 1 else : if nums[mid] <= target <= nums[right]: left = mid + 1 else : right = mid - 1 return -1
结果 执行用时 : 39 ms, 击败 71.66% 使用 Python3 的用户
内存消耗 : 16.74 MB, 击败 36.28% 使用 Python3 的用户
C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 int search (int * nums, int numsSize, int target) { int left = 0 , right = numsSize - 1 ; while (left <= right) { int mid = left + (right - left) / 2 ; if (nums[mid] == target) { return mid; } if (nums[left] <= nums[mid]) { if (nums[left] <= target && target <= nums[mid]) { right = mid - 1 ; } else { left = mid + 1 ; } } else { if (nums[mid] <= target && target <= nums[right]) { left = mid + 1 ; } else { right = mid - 1 ; } } } return -1 ; }
结果 执行用时 : 0 ms, 击败 100.00% 使用 C 的用户
内存消耗 : 5.86 MB, 击败 88.43% 使用 C 的用户
C# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class Solution { public int Search (int [] nums, int target ) { int left = 0 , right = nums.Length - 1 ; while (left <= right) { int mid = left + (right - left) / 2 ; if (nums[mid] == target) { return mid; } if (nums[left] <= nums[mid]) { if (nums[left] <= target && target <= nums[mid]) { right = mid - 1 ; } else { left = mid + 1 ; } } else { if (nums[mid] <= target && target <= nums[right]) { left = mid + 1 ; } else { right = mid - 1 ; } } } return -1 ; } }
结果 执行用时 : 63 ms, 击败 83.77% 使用 C# 的用户
内存消耗 : 41.57 MB, 击败 5.19% 使用 C# 的用户
JavaScript 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 var search = function (nums, target ) { let left = 0 , right = nums.length - 1 ; while (left <= right) { let mid = Math .floor ((left + right) / 2 ); if (nums[mid] === target) { return mid; } if (nums[left] <= nums[mid]) { if (nums[left] <= target && target <= nums[mid]) { right = mid - 1 ; } else { left = mid + 1 ; } } else { if (nums[mid] <= target && target <= nums[right]) { left = mid + 1 ; } else { right = mid - 1 ; } } } return -1 ; };
结果 执行用时 : 52 ms, 击败 95.29% 使用 JavaScript 的用户
内存消耗 : 49.34 MB, 击败 5.11% 使用 JavaScript 的用户
TypeScript 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 function search (nums : number [], target : number ): number { let left = 0 , right = nums.length - 1 ; while (left <= right) { let mid = Math .floor ((left + right) / 2 ); if (nums[mid] === target) { return mid; } if (nums[left] <= nums[mid]) { if (nums[left] <= target && target <= nums[mid]) { right = mid - 1 ; } else { left = mid + 1 ; } } else { if (nums[mid] <= target && target <= nums[right]) { left = mid + 1 ; } else { right = mid - 1 ; } } } return -1 ; }
结果 执行用时 : 59 ms, 击败 87.77% 使用 TypeScript 的用户
内存消耗 : 51.68 MB, 击败 7.42% 使用 TypeScript 的用户
PHP 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 class Solution { function search ($nums , $target ) { $left = 0 ; $right = count ($nums ) - 1 ; while ($left <= $right ) { $mid = (int )(($left + $right ) / 2 ); if ($nums [$mid ] == $target ) { return $mid ; } if ($nums [$left ] <= $nums [$mid ]) { if ($nums [$left ] <= $target && $target <= $nums [$mid ]) { $right = $mid - 1 ; } else { $left = $mid + 1 ; } } else { if ($nums [$mid ] <= $target && $target <= $nums [$right ]) { $left = $mid + 1 ; } else { $right = $mid - 1 ; } } } return -1 ; } }
结果 执行用时 : 9 ms, 击败 46.15% 使用 PHP 的用户
内存消耗 : 20.42 MB, 击败 7.69% 使用 PHP 的用户
Swift 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class Solution { func search (_ nums : [Int ], _ target : Int ) -> Int { var left = 0 var right = nums.count - 1 while left <= right { let mid = (left + right) / 2 if nums[mid] == target { return mid } if nums[left] <= nums[mid] { if nums[left] <= target && target <= nums[mid] { right = mid - 1 } else { left = mid + 1 } } else { if nums[mid] <= target && target <= nums[right] { left = mid + 1 } else { right = mid - 1 } } } return - 1 } }
结果 执行用时 : 7 ms, 击败 99.07% 使用 Swift 的用户
内存消耗 : 15.50 MB, 击败 18.69% 使用 Swift 的用户
Kotlin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class Solution { fun search (nums: IntArray , target: Int ) : Int { var left = 0 var right = nums.size - 1 while (left <= right) { val mid = (left + right) / 2 if (nums[mid] == target) { return mid } if (nums[left] <= nums[mid]) { if (nums[left] <= target && target <= nums[mid]) { right = mid - 1 } else { left = mid + 1 } } else { if (nums[mid] <= target && target <= nums[right]) { left = mid + 1 } else { right = mid - 1 } } } return -1 } }
结果 执行用时 : 154 ms, 击败 95.12% 使用 Kotlin 的用户
内存消耗 : 34.81 MB, 击败 53.66% 使用 Kotlin 的用户
Dart 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class Solution { int search(List <int > nums, int target) { int left = 0 ; int right = nums.length - 1 ; while (left <= right) { int mid = (left + right) ~/ 2 ; if (nums[mid] == target) { return mid; } if (nums[left] <= nums[mid]) { if (nums[left] <= target && target <= nums[mid]) { right = mid - 1 ; } else { left = mid + 1 ; } } else { if (nums[mid] <= target && target <= nums[right]) { left = mid + 1 ; } else { right = mid - 1 ; } } } return -1 ; } }
结果 执行用时 : 289 ms, 击败 100.00% 使用 Dart 的用户
内存消耗 : 147.27 MB, 击败 66.67% 使用 Dart 的用户
Go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 func search (nums []int , target int ) int { left := 0 right := len (nums) - 1 for left <= right { mid := (left + right) / 2 if nums[mid] == target { return mid } if nums[left] <= nums[mid] { if nums[left] <= target && target <= nums[mid] { right = mid - 1 } else { left = mid + 1 } } else { if nums[mid] <= target && target <= nums[right] { left = mid + 1 } else { right = mid - 1 } } } return -1 }
结果 执行用时 : 2 ms, 击败 35.44% 使用 Go 的用户
内存消耗 : 2.39 MB, 击败 30.05% 使用 Go 的用户
Ruby 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 def search (nums, target ) left = 0 right = nums.length - 1 while left <= right mid = (left + right) / 2 if nums[mid] == target return mid end if nums[left] <= nums[mid] if nums[left] <= target && target <= nums[mid] right = mid - 1 else left = mid + 1 end else if nums[mid] <= target && target <= nums[right] left = mid + 1 else right = mid - 1 end end end return -1 end
结果 执行用时 : 64 ms, 击败 40.00% 使用 Ruby 的用户
内存消耗 : 206.52 MB, 击败 40.00% 使用 Ruby 的用户
Scala 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 object Solution { def search (nums: Array [Int ], target: Int ): Int = { var left = 0 var right = nums.length - 1 while (left <= right) { val mid = (left + right) / 2 if (nums(mid) == target) { return mid } if (nums(left) <= nums(mid)) { if (nums(left) <= target && target <= nums(mid)) { right = mid - 1 } else { left = mid + 1 } } else { if (nums(mid) <= target && target <= nums(right)) { left = mid + 1 } else { right = mid - 1 } } } -1 } }
结果 执行用时 : 499 ms, 击败 28.57% 使用 Scala 的用户
内存消耗 : 54.61 MB, 击败 14.29% 使用 Scala 的用户
Rust 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 impl Solution { pub fn search (nums: Vec <i32 >, target: i32 ) -> i32 { let mut left = 0 ; let mut right = nums.len () - 1 ; while left <= right { let mid = (left + right) / 2 ; if nums[mid] == target { return mid as i32 ; } if nums[left] <= nums[mid] { if nums[left] <= target && target <= nums[mid] { right = mid - 1 ; } else { left = mid + 1 ; } } else { if nums[mid] <= target && target <= nums[right] { left = mid + 1 ; } else { right = mid - 1 ; } } } -1 } }
结果 执行用时 : 4 ms, 击败 8.57% 使用 Rust 的用户
内存消耗 : 2.01 MB, 击败 77.14% 使用 Rust 的用户
Racket 暂时未解决
结果 执行用时 : ms, 击败 % 使用 Racket 的用户
内存消耗 : MB, 击败 % 使用 Racket 的用户
Erlang 暂时未解决
结果 执行用时 : ms, 击败 % 使用 Erlang 的用户
内存消耗 : MB, 击败 % 使用 Erlang 的用户
Elixir 暂时未解决
结果 执行用时 : ms, 击败 % 使用 Elixir 的用户
内存消耗 : MB, 击败 % 使用 Elixir 的用户