Skip to content

Commit b9272fe

Browse files
committed
33. Search in Rotated Sorted Array
```Solution.c int search(int* nums, int numsSize, int target) { int l = 0, r = numsSize - 1; while (l <= r) { int mid = l + (r - l) / 2; if (nums[mid] == target) return mid; if (nums[l] <= nums[mid]) { if (nums[l] <= target && target < nums[mid]) r = mid - 1; else l = mid + 1; } else { if (nums[mid] < target && target <= nums[r]) l = mid + 1; else r = mid - 1; } } return -1; } ``` ```Solution.cpp class Solution { public: int search(vector<int>& nums, int target) { int l = 0, r = nums.size() - 1; while (l <= r) { int mid = l + (r - l) / 2; if (nums[mid] == target) return mid; if (nums[l] <= nums[mid]) { if (nums[l] <= target && target < nums[mid]) r = mid - 1; else l = mid + 1; } else { if (nums[mid] < target && target <= nums[r]) l = mid + 1; else r = mid - 1; } } return -1; } }; ``` ```Solution.cs public class Solution { public int Search(int[] nums, int target) { int l = 0, r = nums.Length - 1; while (l <= r) { int mid = l + (r - l) / 2; if (nums[mid] == target) return mid; if (nums[l] <= nums[mid]) { if (nums[l] <= target && target < nums[mid]) r = mid - 1; else l = mid + 1; } else { if (nums[mid] < target && target <= nums[r]) l = mid + 1; else r = mid - 1; } } return -1; } } ``` ```Solution.dart class Solution { int search(List<int> nums, int target) { int l = 0, r = nums.length - 1; while (l <= r) { int mid = (l + r) >> 1; if (nums[mid] == target) return mid; if (nums[l] <= nums[mid]) { if (nums[l] <= target && target < nums[mid]) r = mid - 1; else l = mid + 1; } else { if (nums[mid] < target && target <= nums[r]) l = mid + 1; else r = mid - 1; } } return -1; } } ``` ```Solution.erl -spec search([integer()], integer()) -> integer(). search(Nums, Target) -> search(Nums, Target, 0, length(Nums) - 1). search(Nums, Target, L, R) when L =< R -> Mid = (L + R) div 2, Val = lists:nth(Mid+1, Nums), LVal = lists:nth(L+1, Nums), RVal = lists:nth(R+1, Nums), if Val =:= Target -> Mid; LVal =< Val -> if LVal =< Target, Target < Val -> search(Nums, Target, L, Mid - 1); true -> search(Nums, Target, Mid + 1, R) end; true -> if Val < Target, Target =< RVal -> search(Nums, Target, Mid + 1, R); true -> search(Nums, Target, L, Mid - 1) end end; search(_, _, _, _) -> -1. ``` ```Solution.ex defmodule Solution do @SPEC search(nums :: [integer], target :: integer) :: integer def search(nums, target) do helper(nums, target, 0, length(nums) - 1) end defp helper(nums, target, l, r) when l <= r do mid = div(l + r, 2) val = Enum.at(nums, mid) cond do val == target -> mid Enum.at(nums, l) <= val -> if Enum.at(nums, l) <= target and target < val, do: helper(nums, target, l, mid - 1), else: helper(nums, target, mid + 1, r) true -> if val < target and target <= Enum.at(nums, r), do: helper(nums, target, mid + 1, r), else: helper(nums, target, l, mid - 1) end end defp helper(_, _, _, _), do: -1 end ``` ```Solution.go func search(nums []int, target int) int { l, r := 0, len(nums)-1 for l <= r { mid := (l + r) / 2 if nums[mid] == target { return mid } if nums[l] <= nums[mid] { if nums[l] <= target && target < nums[mid] { r = mid - 1 } else { l = mid + 1 } } else { if nums[mid] < target && target <= nums[r] { l = mid + 1 } else { r = mid - 1 } } } return -1 } ``` ```Solution.java class Solution { public int search(int[] nums, int target) { int l = 0, r = nums.length - 1; while (l <= r) { int mid = l + (r - l) / 2; if (nums[mid] == target) return mid; if (nums[l] <= nums[mid]) { if (nums[l] <= target && target < nums[mid]) r = mid - 1; else l = mid + 1; } else { if (nums[mid] < target && target <= nums[r]) l = mid + 1; else r = mid - 1; } } return -1; } } ``` ```Solution.js /** * @param {number[]} nums * @param {number} target * @return {number} */ var search = function(nums, target) { let l = 0, r = nums.length - 1; while (l <= r) { let mid = Math.floor((l + r) / 2); if (nums[mid] === target) return mid; if (nums[l] <= nums[mid]) { if (nums[l] <= target && target < nums[mid]) r = mid - 1; else l = mid + 1; } else { if (nums[mid] < target && target <= nums[r]) l = mid + 1; else r = mid - 1; } } return -1; }; ``` ```Solution.kt class Solution { fun search(nums: IntArray, target: Int): Int { var l = 0 var r = nums.size - 1 while (l <= r) { val mid = (l + r) / 2 if (nums[mid] == target) return mid if (nums[l] <= nums[mid]) { if (nums[l] <= target && target < nums[mid]) r = mid - 1 else l = mid + 1 } else { if (nums[mid] < target && target <= nums[r]) l = mid + 1 else r = mid - 1 } } return -1 } } ``` ```Solution.php class Solution { /** * @param Integer[] $nums * @param Integer $target * @return Integer */ function search($nums, $target) { $l = 0; $r = count($nums) - 1; while ($l <= $r) { $mid = intdiv($l + $r, 2); if ($nums[$mid] == $target) return $mid; if ($nums[$l] <= $nums[$mid]) { if ($nums[$l] <= $target && $target < $nums[$mid]) $r = $mid - 1; else $l = $mid + 1; } else { if ($nums[$mid] < $target && $target <= $nums[$r]) $l = $mid + 1; else $r = $mid - 1; } } return -1; } } ``` ```Solution.py class Solution: def search(self, nums: List[int], target: int) -> int: l, r = 0, len(nums) - 1 while l <= r: mid = (l + r) // 2 if nums[mid] == target: return mid if nums[l] <= nums[mid]: if nums[l] <= target < nums[mid]: r = mid - 1 else: l = mid + 1 else: if nums[mid] < target <= nums[r]: l = mid + 1 else: r = mid - 1 return -1 ``` ```Solution.rb # @param {Integer[]} nums # @param {Integer} target # @return {Integer} def search(nums, target) l, r = 0, nums.length - 1 while l <= r mid = (l + r) / 2 return mid if nums[mid] == target if nums[l] <= nums[mid] if nums[l] <= target && target < nums[mid] r = mid - 1 else l = mid + 1 end else if nums[mid] < target && target <= nums[r] l = mid + 1 else r = mid - 1 end end end -1 end ``` ```Solution.rkt #lang racket (define (search nums target) (define (helper l r) (if (> l r) -1 (let* ([mid (quotient (+ l r) 2)] [val (list-ref nums mid)]) (cond [(= val target) mid] [(<= (list-ref nums l) val) (if (and (<= (list-ref nums l) target) (< target val)) (helper l (- mid 1)) (helper (+ mid 1) r))] [else (if (and (< val target) (<= target (list-ref nums r))) (helper (+ mid 1) r) (helper l (- mid 1)))])))) (helper 0 (- (length nums) 1))) ``` ```Solution.rs impl Solution { pub fn search(nums: Vec<i32>, target: i32) -> i32 { let (mut l, mut r) = (0, nums.len() as i32 - 1); while l <= r { let mid = l + (r - l) / 2; if nums[mid as usize] == target { return mid; } if nums[l as usize] <= nums[mid as usize] { if nums[l as usize] <= target && target < nums[mid as usize] { r = mid - 1; } else { l = mid + 1; } } else { if nums[mid as usize] < target && target <= nums[r as usize] { l = mid + 1; } else { r = mid - 1; } } } -1 } } ``` ```Solution.scala object Solution { def search(nums: Array[Int], target: Int): Int = { var l = 0 var r = nums.length - 1 while (l <= r) { val mid = (l + r) / 2 if (nums(mid) == target) return mid if (nums(l) <= nums(mid)) { if (nums(l) <= target && target < nums(mid)) r = mid - 1 else l = mid + 1 } else { if (nums(mid) < target && target <= nums(r)) l = mid + 1 else r = mid - 1 } } -1 } } ``` ```Solution.swift class Solution { func search(_ nums: [Int], _ target: Int) -> Int { var l = 0, r = nums.count - 1 while l <= r { let mid = (l + r) / 2 if nums[mid] == target { return mid } if nums[l] <= nums[mid] { if nums[l] <= target && target < nums[mid] { r = mid - 1 } else { l = mid + 1 } } else { if nums[mid] < target && target <= nums[r] { l = mid + 1 } else { r = mid - 1 } } } return -1 } } ``` ```Solution.ts function search(nums: number[], target: number): number { let l = 0, r = nums.length - 1; while (l <= r) { let mid = Math.floor((l + r) / 2); if (nums[mid] === target) return mid; if (nums[l] <= nums[mid]) { if (nums[l] <= target && target < nums[mid]) r = mid - 1; else l = mid + 1; } else { if (nums[mid] < target && target <= nums[r]) l = mid + 1; else r = mid - 1; } } return -1; } ```
1 parent c300764 commit b9272fe

19 files changed

+375
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# [**33. Search in Rotated Sorted Array**](https://leetcode.com/problems/search-in-rotated-sorted-array/description/)
2+
3+
There is an integer array `nums` sorted in ascending order (with **distinct** values).
4+
5+
Prior to being passed to your function, `nums` is **possibly left rotated** at an unknown index `k` (`1 <= k < nums.length`) such that the resulting array is `[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]` (**0-indexed**). For example, `[0,1,2,4,5,6,7]` might be left rotated by `3` indices and become `[4,5,6,7,0,1,2]`.
6+
7+
Given the array `nums` **after** the possible rotation and an integer `target`, return the index of `target` if it is in `nums`, or `-1` if it is not in `nums`.
8+
9+
You must write an algorithm with `O(log n)` runtime complexity.
10+
11+
#### **Example 1:**
12+
```md
13+
Input: nums = [4,5,6,7,0,1,2], target = 0
14+
Output: 4
15+
```
16+
17+
#### **Example 2:**
18+
```md
19+
Input: nums = [4,5,6,7,0,1,2], target = 3
20+
Output: -1
21+
```
22+
23+
#### **Example 3:**
24+
```md
25+
Input: nums = [1], target = 0
26+
Output: -1
27+
```
28+
29+
#### **Constraints:**
30+
> - `1 <= nums.length <= 5000`
31+
> - `-10⁴ <= nums[i] <= 10⁴`
32+
> - All values of `nums` are **unique**.
33+
> - `nums` is an ascending array that is possibly rotated.
34+
> - `-10⁴ <= target <= 10⁴`
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
int search(int* nums, int numsSize, int target) {
2+
int l = 0, r = numsSize - 1;
3+
while (l <= r) {
4+
int mid = l + (r - l) / 2;
5+
if (nums[mid] == target) return mid;
6+
if (nums[l] <= nums[mid]) {
7+
if (nums[l] <= target && target < nums[mid]) r = mid - 1;
8+
else l = mid + 1;
9+
} else {
10+
if (nums[mid] < target && target <= nums[r]) l = mid + 1;
11+
else r = mid - 1;
12+
}
13+
}
14+
return -1;
15+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public:
3+
int search(vector<int>& nums, int target) {
4+
int l = 0, r = nums.size() - 1;
5+
while (l <= r) {
6+
int mid = l + (r - l) / 2;
7+
if (nums[mid] == target) return mid;
8+
if (nums[l] <= nums[mid]) {
9+
if (nums[l] <= target && target < nums[mid]) r = mid - 1;
10+
else l = mid + 1;
11+
} else {
12+
if (nums[mid] < target && target <= nums[r]) l = mid + 1;
13+
else r = mid - 1;
14+
}
15+
}
16+
return -1;
17+
}
18+
};
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
public class Solution {
2+
public int Search(int[] nums, int target) {
3+
int l = 0, r = nums.Length - 1;
4+
while (l <= r) {
5+
int mid = l + (r - l) / 2;
6+
if (nums[mid] == target) return mid;
7+
if (nums[l] <= nums[mid]) {
8+
if (nums[l] <= target && target < nums[mid]) r = mid - 1;
9+
else l = mid + 1;
10+
} else {
11+
if (nums[mid] < target && target <= nums[r]) l = mid + 1;
12+
else r = mid - 1;
13+
}
14+
}
15+
return -1;
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
int search(List<int> nums, int target) {
3+
int l = 0, r = nums.length - 1;
4+
while (l <= r) {
5+
int mid = (l + r) >> 1;
6+
if (nums[mid] == target) return mid;
7+
if (nums[l] <= nums[mid]) {
8+
if (nums[l] <= target && target < nums[mid]) r = mid - 1;
9+
else l = mid + 1;
10+
} else {
11+
if (nums[mid] < target && target <= nums[r]) l = mid + 1;
12+
else r = mid - 1;
13+
}
14+
}
15+
return -1;
16+
}
17+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-spec search([integer()], integer()) -> integer().
2+
search(Nums, Target) ->
3+
search(Nums, Target, 0, length(Nums) - 1).
4+
search(Nums, Target, L, R) when L =< R ->
5+
Mid = (L + R) div 2,
6+
Val = lists:nth(Mid+1, Nums),
7+
LVal = lists:nth(L+1, Nums),
8+
RVal = lists:nth(R+1, Nums),
9+
if Val =:= Target -> Mid;
10+
LVal =< Val ->
11+
if LVal =< Target, Target < Val ->
12+
search(Nums, Target, L, Mid - 1);
13+
true -> search(Nums, Target, Mid + 1, R)
14+
end;
15+
true ->
16+
if Val < Target, Target =< RVal ->
17+
search(Nums, Target, Mid + 1, R);
18+
true -> search(Nums, Target, L, Mid - 1)
19+
end
20+
end;
21+
search(_, _, _, _) -> -1.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
defmodule Solution do
2+
@spec search(nums :: [integer], target :: integer) :: integer
3+
def search(nums, target) do
4+
helper(nums, target, 0, length(nums) - 1)
5+
end
6+
defp helper(nums, target, l, r) when l <= r do
7+
mid = div(l + r, 2)
8+
val = Enum.at(nums, mid)
9+
cond do
10+
val == target -> mid
11+
Enum.at(nums, l) <= val ->
12+
if Enum.at(nums, l) <= target and target < val,
13+
do: helper(nums, target, l, mid - 1),
14+
else: helper(nums, target, mid + 1, r)
15+
true ->
16+
if val < target and target <= Enum.at(nums, r),
17+
do: helper(nums, target, mid + 1, r),
18+
else: helper(nums, target, l, mid - 1)
19+
end
20+
end
21+
defp helper(_, _, _, _), do: -1
22+
end
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func search(nums []int, target int) int {
2+
l, r := 0, len(nums)-1
3+
for l <= r {
4+
mid := (l + r) / 2
5+
if nums[mid] == target {
6+
return mid
7+
}
8+
if nums[l] <= nums[mid] {
9+
if nums[l] <= target && target < nums[mid] {
10+
r = mid - 1
11+
} else {
12+
l = mid + 1
13+
}
14+
} else {
15+
if nums[mid] < target && target <= nums[r] {
16+
l = mid + 1
17+
} else {
18+
r = mid - 1
19+
}
20+
}
21+
}
22+
return -1
23+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public int search(int[] nums, int target) {
3+
int l = 0, r = nums.length - 1;
4+
while (l <= r) {
5+
int mid = l + (r - l) / 2;
6+
if (nums[mid] == target) return mid;
7+
if (nums[l] <= nums[mid]) {
8+
if (nums[l] <= target && target < nums[mid]) r = mid - 1;
9+
else l = mid + 1;
10+
} else {
11+
if (nums[mid] < target && target <= nums[r]) l = mid + 1;
12+
else r = mid - 1;
13+
}
14+
}
15+
return -1;
16+
}
17+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* @param {number[]} nums
3+
* @param {number} target
4+
* @return {number}
5+
*/
6+
var search = function(nums, target) {
7+
let l = 0, r = nums.length - 1;
8+
while (l <= r) {
9+
let mid = Math.floor((l + r) / 2);
10+
if (nums[mid] === target) return mid;
11+
if (nums[l] <= nums[mid]) {
12+
if (nums[l] <= target && target < nums[mid]) r = mid - 1;
13+
else l = mid + 1;
14+
} else {
15+
if (nums[mid] < target && target <= nums[r]) l = mid + 1;
16+
else r = mid - 1;
17+
}
18+
}
19+
return -1;
20+
};

0 commit comments

Comments
 (0)