二分法和快慢指针

本文介绍了数组的基础知识,包括其存储特性和元素操作。接着讨论了二分搜索法的实现,特别是左闭右开区间的应用。此外,文章还展示了如何使用快慢指针法在O(n)时间内移除数组元素,避免了暴力解法的时间复杂度问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、数组理论基础

        数组是存放在连续空间中相同数据的集合

 09b77179778b4b3f88a06cf6e94bb101.png

         其次数组的元素不能删除只能覆盖,数组的增删必然需要移动其他元素。

二、二分搜索法

        二分搜索法顾名思义,即把一个有序的数组不断地进行二分已得到最终答案,但是也有需要注意的点,以区间为左闭右开为例:

int search(int* nums, int numsSize, int target){
    int left=0;
    int right=numsSize-1;
    while(left<=right)
    {
        int mid=(left+right)/2;
        if(nums[mid]>target)
        {
            right=mid-1;
            //更新右端点
        }
        else if(nums[mid]<target)
        {
            left=mid+1;
            //更新左端点
        }
        else if(nums[mid]==target)
        {
            return mid;
        }
        
    }return -1;
}

         若定义区间为左闭右开,即:

        1.while (left<=right)改为小于;

        2.右端点更新时取right=mid;

        3.左端点不改变。

三、移除数组元素(快慢指针法)

         如果使用暴力解法,即使用双循环,时间复杂度将是o(n*2),但如果使用双指针法,时间复杂度将是o(n),因为只进行了一次循环,所谓双指针,即有一个快指针和一个慢指针,快指针用来寻找填入数组的数据,慢指针用来确定填入数据的位置,如下链接有动画演示

代码随想录

int removeElement(int* nums, int numsSize, int val){
    int slow=0;
    for(int fast=0;fast<numsSize;fast++)
    {
        if(nums[fast]!=val)
        nums[slow++]=nums[fast];
    }
    return slow;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值