PS:算法并非原创,仅作个人学习记录使用,侵删
题目描述
算法分析
个人的思路是在排序数组中依次遍历,如果比待插入元素小,则下标向后移动,直到遇到下标大于等于插入元素,此时的下标值就是结果。
或者采用二分法,更快的确定搜索范围。
后续的洛谷题解中,二分法基本上是算法实现的主流。
也有一些直接使用已有函数一步到位的“神仙”操作,不过需要个人对于语言的函数库有很好的理解和掌握,像我这种凡人小白暂时还用不上这种方法。
代码实现
【C】
/*
二分法的递归写法
*/
int searchInsert(int* nums, int numsSize, int target){
int middle = numsSize / 2;//计算中间下标位置
//递归结束的条件
if (middle == 0){//中间值为0,表示数组大小为1或者0
if (target <= nums[0]){//如果待插入元素小于等于第一个值,那么插入位置为下标0(第一个位置)
return 0;
}
else{//否则,插入位置在下标1(第二个位置)
return 1;
}
}
//middle!=0,继续二分递归
else if (nums[middle] >= target){//如果待插入元素的位置在左半部分
return searchInsert(nums, middle, target);//numsSize减半
}
else{//待插入元素的位置在右半部分
return searchInsert(nums+middle, numsSize-middle, target) + middle;//数组起始位置移动到中间下标位置,数组大小减半,但是考虑到最终结果,每次都要加上前一半的元素个数
}
}
【C++】
/*使用STL(标准模板库)
使用迭代器直接求解
*/
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
return lower_bound(nums.begin(), nums.end(), target) - nums.begin();//一步到位
}
};
【Java】
/*
官方题解——二分法
*/
class Solution {
public int searchInsert(int[] nums, int target) {
int n = nums.length;
int left = 0, right = n - 1, ans = n;
while (left <= right) {//不断二分
int mid = ((right - left) >> 1) + left;//寻找二分的分界点
if (target <= nums[mid]) {//如果目标元素小于等于中间元素。说明在左边
ans = mid;
right = mid - 1;//表示进入左侧区间进行操作
}
else {//进入右侧区间
left = mid + 1;
}
}
return ans;//最终结果等于某个二分分界点
}
}
【python】
#直接调用python强大的功能函数库来解决插入位置问题。
#有一说一,相当朴素(赞
class Solution:
def searchInsert(self, nums, target):
import bisect
try:
return nums.index(target)
except:
return bisect.bisect(nums,target)