Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
leetcode刷题35搜索插入位置
前文
本文为leetcode遍历类型问题,题目序号为35,主要考察遍历时的效率问题。
题目信息
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
解题思路
根据题目信息,很容易想到通过遍历得到结果。但由于题目中有时间复杂度的要求,因此本文采用二分法的方式处理。首先要对一些特殊情况进行单独的处理。此后,每次都获取数组的中间节点,判断目标数据落在数组的哪部分,再将该部分作为新的数据进行二分操作。重复以上步骤,直至数组的长度等于2或找到目标数值,即可得到解体的方案。利用这种方式,满足了对于时间复杂度的要求,能够达到最高的执行效率。
解题代码
public int searchInsert(int[] nums, int target) {
return searchPos(nums,0,nums.length - 1,target);
}
public int searchPos(int[] nums, int begin,int end,int target){
int length = end - begin + 1;
if(length == 0){
return 0;
}
if(length == 1){
if(nums[begin] == target){
return begin;
}
return nums[begin] < target ? begin + 1 : begin;
}
if(length == 2){
if(target == nums[begin]){
return begin;
}else if(target == nums[end]){
return end;
}else if(target > nums[begin] && target < nums[end]){
return end;
}else if(target < nums[begin]){
return begin;
}else{
return end + 1;
}
}else{
int middle = (int) Math.floor((begin + end)/2);
if(nums[middle] > target){
return searchPos(nums,begin,middle,target);
}else if(nums[middle] < target){
return searchPos(nums,middle,end,target);
}else {
return middle;
}
}
}