题目
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
示例 1:
输入:
nums = [-1,0,3,5,9,12], target= 9
输出: 4
解释: 9 出现在nums中并且下标为 4
示例 2:
输入:
nums = [-1,0,3,5,9,12], target= 2
输出: -1
解释: 2 不存在nums中,因此返回 -1。
首先,给出暴力解法
java
class Solution {
public int search(int[] nums, int target) {
for(int i = 0;i < nums.length;i++){
//循环nums数组,寻找target
if(nums[i] == target){
return i;
//找到则返回下标,数组下标从0开始
}
}
return -1;
//退出循环仍没有返回,则说明没有找到,则返回-1
}
}
其次,二分法解法[i,j)
java
class Solution {
public int search(int[] nums, int target) {
int i = 0;
// 初始化变量 i 为 0,i 代表当前查找范围的左边界索引
int j = nums.length;
// 初始化变量 j 为数组 nums 的长度,j 代表当前查找范围的右边界索引
while(i < j){
// 当左边界索引 i 小于右边界索引 j 时,持续循环查找
int m = (i+j) >>>1;
// 计算当前查找范围的中间索引 m
// 使用无符号右移运算符 >>> 进行整除操作,确保结果为整数
if(target > nums[m]){
i = m+1;
// 则将左边界索引 i 更新为 m + 1,缩小查找范围到右半部分
}else if(target < nums[m]){
j = m;
// 则将右边界索引 j 更新为 m,缩小查找范围到左半部分
}else{
return m;
}
}
return -1;
// 若循环结束仍未找到目标值,返回 -1 表示未找到
}
}
i,j
java
class Solution {
public int search(int[] nums, int target) {
int i = 0;
// 初始化变量 i 为 0,i 代表当前查找范围的左边界索引
int j = nums.length-1;
// 初始化变量 j 为数组 nums 的长度,j 代表当前查找范围的右边界索引
while(i <= j){
// 当左边界索引 i 小于等于右边界索引 j 时,持续循环查找
int m = (i+j) >>>1;
// 计算当前查找范围的中间索引 m
// 使用无符号右移运算符 >>> 进行整除操作,确保结果为整数
if(target > nums[m]){
i = m+1;
// 则将左边界索引 i 更新为 m + 1,缩小查找范围到右半部分
}else if(target < nums[m]){
j = m-1;
// 则将右边界索引 j 更新为 m - 1,缩小查找范围到左半部分
}else{
return m;
}
}
return -1;
// 若循环结束仍未找到目标值,返回 -1 表示未找到
}
}