comments | difficulty | edit_url | tags | ||
---|---|---|---|---|---|
true |
Easy |
|
Given an array of integers nums
which is sorted in ascending order, and an integer target
, write a function to search target
in nums
. If target
exists, then return its index. Otherwise, return -1
.
You must write an algorithm with O(log n)
runtime complexity.
Example 1:
Input: nums = [-1,0,3,5,9,12], target = 9 Output: 4 Explanation: 9 exists in nums and its index is 4
Example 2:
Input: nums = [-1,0,3,5,9,12], target = 2 Output: -1 Explanation: 2 does not exist in nums so return -1
Constraints:
1 <= nums.length <= 104
-104 < nums[i], target < 104
- All the integers in
nums
are unique. nums
is sorted in ascending order.
We define the left boundary of the binary search as
In each iteration, we calculate the middle position
- If
$nums[mid] \geq target$ , it means that$target$ is in the interval$[left, mid]$ , so we update$right$ to$mid$ ; - Otherwise,
$target$ is in the interval$[mid+1, right]$ , so we update$left$ to$mid+1$ .
When
The time complexity is
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left < right:
mid = (left + right) >> 1
if nums[mid] >= target:
right = mid
else:
left = mid + 1
return left if nums[left] == target else -1
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left < right) {
int mid = (left + right) >> 1;
if (nums[mid] >= target) {
right = mid;
} else {
left = mid + 1;
}
}
return nums[left] == target ? left : -1;
}
}
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while (left < right) {
int mid = left + right >> 1;
if (nums[mid] >= target)
right = mid;
else
left = mid + 1;
}
return nums[left] == target ? left : -1;
}
};
func search(nums []int, target int) int {
left, right := 0, len(nums)-1
for left < right {
mid := (left + right) >> 1
if nums[mid] >= target {
right = mid
} else {
left = mid + 1
}
}
if nums[left] == target {
return left
}
return -1
}
use std::cmp::Ordering;
impl Solution {
pub fn search(nums: Vec<i32>, target: i32) -> i32 {
let mut l = 0;
let mut r = nums.len();
while l < r {
let mid = (l + r) >> 1;
match nums[mid].cmp(&target) {
Ordering::Less => {
l = mid + 1;
}
Ordering::Greater => {
r = mid;
}
Ordering::Equal => {
return mid as i32;
}
}
}
-1
}
}
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function (nums, target) {
let left = 0;
let right = nums.length - 1;
while (left < right) {
const mid = (left + right) >> 1;
if (nums[mid] >= target) {
right = mid;
} else {
left = mid + 1;
}
}
return nums[left] == target ? left : -1;
};
public class Solution {
public int Search(int[] nums, int target) {
int left = 0, right = nums.Length - 1;
while (left < right) {
int mid = (left + right) >> 1;
if (nums[mid] >= target) {
right = mid;
} else {
left = mid + 1;
}
}
return nums[left] == target ? left : -1;
}
}