持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
今天,我们继续搞算法。
题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
题目分析
这个题目是让我们找到其目标值返回索引,查找目标值的话我们用缩小区间的方法也就是二分查找,每次查一半,所以我们需要一个中间值,如果目标值比中间值小,中间值后面的度大,是叭,所以我们移动right到mid-1,否则我们就移动left到mid+1,如果没有找到,说明没有,我们看示例3,就是没有目标值,就返回插入位置,那最后的插入位置在末尾,所以我们加1,就是插入位置。
解题思路
- 确定操作对象:本题中,操作对象1个nums,target
- 确定操作条件:操作条件只要left = right就返回。
- 确定操作过程:操作过程为,按照题目条件缩小查找区间。
- 确定结果返回:返回最终结果。
代码
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length -1;
while(left <right){
int mid = left+(right - left)/2;
if(nums[mid]<target){
left = mid +1;
}else if(nums[mid]>target){
right = mid-1;
}else{
return mid ;
}
}
if(nums[left]<target){
return left+1;
}
return left;
}
}
总结
这是一道简单题目,我觉得题目本身不是很难,我们需要根据示例来理解题目本身的含义,然后用设计实现我们的程序,如果找到了就返回当前位置,没找到就返回插入位置,我们要把这个数的规律转化成程序思路才能完成本题。