33. Search in rotated array
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[mid] >= nums[left]) {
if (target < nums[mid] && target >= nums[left])
right = mid - 1;
else
left = mid + 1;
} else {
if (target <= nums[right] && target > nums[mid])
left = mid + 1;
else
right = mid - 1;
}
}
return -1;
}
33_solution1.cpp
#include <vector>
using namespace std;
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[mid] >= nums[left]) {
if (target < nums[mid] && target >= nums[left])
right = mid - 1;
else
left = mid + 1;
} else {
if (target <= nums[right] && target > nums[mid])
left = mid + 1;
else
right = mid - 1;
}
}
return -1;
}
};
33_solution2.cpp
#include <vector>
using namespace std;
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[mid] > nums[right]) {
if (target <= nums[right] || target > nums[mid]) {
left = mid + 1;
} else {
right = mid - 1;
}
} else {
if (target <= nums[right] && target > nums[mid])
left = mid + 1;
else
right = mid - 1;
}
}
return -1;
}
};
package main
func search(nums []int, target int) int {
left, right := 0, len(nums)-1
for left <= right {
mid := left + (right-left)/2
if nums[mid] == target {
return mid
}
if nums[mid] >= nums[left] {
if target < nums[mid] && target >= nums[left] {
right = mid - 1
} else {
left = mid + 1
}
} else {
if target <= nums[right] && target > nums[mid] {
left = mid + 1
} else {
right = mid - 1
}
}
}
return -1
}
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[mid] >= nums[left]) {
if (target < nums[mid] && target >= nums[left])
right = mid - 1;
else
left = mid + 1;
} else {
if (target <= nums[right] && target > nums[mid])
left = mid + 1;
else
right = mid - 1;
}
}
return -1;
}
}
class Solution {
search(nums, target) {
let left = 0, right = nums.length - 1;
while (left <= right) {
const mid = left + Math.floor((right - left) / 2);
if (nums[mid] === target) return mid;
if (nums[mid] >= nums[left]) {
if (target < nums[mid] && target >= nums[left]) right = mid - 1;
else left = mid + 1;
} else {
if (target <= nums[right] && target > nums[mid]) left = mid + 1;
else right = mid - 1;
}
}
return -1;
}
}
class Solution:
def search(self, nums: list[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
return mid
if nums[mid] >= nums[left]:
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
struct Solution;
impl Solution {
fn search(nums: Vec<i32>, target: i32) -> i32 {
let mut left = 0i32;
let mut right = nums.len() as i32 - 1;
while left <= right {
let mid = left + (right - left) / 2;
let (l, m) = (left as usize, mid as usize);
if nums[m] == target {
return mid;
}
if nums[m] >= nums[l] {
if target < nums[m] && target >= nums[l] {
right = mid - 1;
} else {
left = mid + 1;
}
} else {
let r = right as usize;
if target <= nums[r] && target > nums[m] {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
-1
}
}