题目链接:35.搜索插入位置
题目描述
给定一个排序数组和一个目标值,在数组中找到目标值
,并返回其索引
。如果目标值不存在
于数组中,返回它将会被按顺序插入的位置
。
示例 1
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3
输入: nums = [1,3,5,6], target = 7
输出: 4
提示
- 1 <= nums.length <= 104
- -104 <= nums[i] <= 104
- nums 为
无重复元素
的升序
排列数组 - 104 <= target <= 104
Code
解法一:暴力搜索
因为题目已经说了是升序排序且无重复元素,直接遍历判断直到刚刚好到边界的时候,可以直接返回对应的索引或者插入的位置
public int searchInsert(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
if (target <= nums[i]) {
return i;
}
}
return nums.length;
}
解法二:二分查找
既然是有序的序列那么二分查找肯定会优一点,但是这里需要注意一下边界条件
public int searchInsert(int[] nums, int target) {
int start = 0;//起点
int end = nums.length - 1;//终点
int resNum = 0;
if (target > nums[nums.length - 1]) {
return nums.length;
}else if (target < nums[0]) {
return 0;
}//判断首尾,直接放置
while(start <= end) {
int middle = (start + end) / 2;//中间位置
if (target == nums[middle]) {
resNum = middle;
break;
}else if (target > nums[middle]) {
if (target < nums[middle + 1]) {
return middle + 1;
}
start = middle + 1;//middle已经判断过了,不用再判断了
}else if (target < nums[middle]) {
if (target > nums[middle - 1]) {
return middle;
}
end = middle - 1;//middle已经判断过了,不用再判断了
}
}
return resNum;
}
如果写的繁琐一点那么第一段代码,下面这段相比就简洁一些,把一些重复的边界过程判断合并在一起了
public int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int middle = (right - left) / 2 + left;
if (target <= nums[middle]) {
right = middle - 1;
} else {
left = middle + 1;
}
}
return left;
}