每日一题
搜索插入位置
思路(实现代码)
看到这是一个无重复元素的升序排列数组,且题目规定时间复杂度为O(logn),那么我们可以很容易的想到这题要用二分查找算法
如果目标值存在,那好办,就是普通的二分查找。但题目还要求,如果目标值不存在于数组,那么还要返回它将被按顺序插入的位置。那么怎么找到要插入的位置呢?
先展示实现代码
int searchInsert(int* nums, int numsSize, int target){ int left = 0; int right = numsSize - 1; while(left <= right) { int mid = (right - left) / 2 + left; //为防止right + left发生整型溢出,故用此方法计算 if(nums[mid] < target) left = mid + 1; else if(nums[mid] > target) right = mid - 1; else return mid; } return left; }
为什么就是直接插入在left位置呢,想了很久,感觉还是举例子画图更容易理解。
首先我们需要明确,若已知数组中不存在目标元素target,那么进行最后一次while循环时,left必定等于right(如下图)
通过图形的分析,我们确实可以确定若·targett不存在,那么left就是要插入的下标位置
PS:笔者对这题的思路可能也不是太准确,欢迎大家的斧正。