Leetcode算法练习:搜索插入位置
【前言】:数据结构与算法经典问题 – 折半查找算法知识点巩固,通过这道题的练习可以进一步加深对折半查找设计思想的理解,同时能够在今后遇到类似的问题能够灵活运用所学的知识;
题目链接跳转
代码展示(AC代码)
class Solution {
public int searchInsert(int[] nums, int target) {
int len = nums.length;
int left = 0;
int right = len-1;
int mid;
//能够查找到的情形,通过折半查找法即可求出target在数组中的元素
while(left<right){
mid = (left+right)/2;
if(nums[mid]>target){//当前查找的元素大小比目标值大右指针向左移动
right = mid-1;
}else if(nums[mid]<target){//当前查找的元素大小比目标值小做指针向右移动
left = mid+1;
}else{//存在该元素,返回对应的下标
return mid;
}
}
//没有查找到的情形,但是left指针指向的元素的结果是非常接近目标结果的
if(nums[left]>=target){//如果left指针指向的元素结果不小于目标值,则插在left指针的前面
return left;
}
return left+1;//反之插在left指着指向元素后面
}
}
思路解读
- 涉及知识点:折半查找算法;
- 这道题的出来的结果无外乎是两种情形,一种是目标元素 t a r g e t target target 在数组 n u m s nums nums 中,另一种情形就是目标元素不在数组中;(1)假设目标元素 t a r g e t target target 是在数组 n u m s nums nums ,则通过折半查找算法即可找到该元素在数组的下标。(2)假设目标元素 t a r g e t target target 不在数组 n u m s nums nums。在数组查找不到目标元素我们找到最后一轮折半查找时 l e f t left left 指针所指向的元素。而此时 l e f t left left 指针指向的元素是最接近目标元素 t a r g e t target target 的大小的。
- 此时我们根据 n u m s [ l e f t ] nums[left] nums[left] 和 t a r g e t target target 的大小情况进行分类讨论,如果 n u m s [ l e f t ] > t a r g e t nums[left]>target nums[left]>target,则 l e f t + 1 left+1 left+1 为元素插入的位置 ,如果 n u m s [ l e f t ] < = t a r g e t nums[left]<=target nums[left]<=target ,则 l e f t left left 为元素插入的位置