leetcode 35.搜索插入位置(C/C++/Java/python)

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语言参考网址

【C++】

/*使用STL(标准模板库)
使用迭代器直接求解
*/
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        return lower_bound(nums.begin(), nums.end(), target) - nums.begin();//一步到位
    }
};

C++参考网址

【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;//最终结果等于某个二分分界点
    }
}

java参考网址

【python】

#直接调用python强大的功能函数库来解决插入位置问题。
#有一说一,相当朴素(赞
class Solution:
    def searchInsert(self, nums, target):
        import bisect
        try:
            return nums.index(target) 
        except:
            return bisect.bisect(nums,target)

python参考网址

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值