从二分法到双指针

本文介绍了二分查找的基本原理和应用,包括二分法求开平方、搜索目标元素以及处理重复目标值的情况。接着讨论了双指针方法,通过移除指定元素、删除有序数组中的重复项以及归并两个有序数组等实例,阐述了双指针在解决数组问题中的作用。

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

2022/03/28  合并有序数组-双指针

目录

一、二分查找

二、双指针


--为了方便后面我们在二分法中使用的数组,假设都是升序的--

一、二分查找

1. 二分法简述

        二分查找也叫折半查找,顾名思义就是将要查找的区间(有序的)通过比较区间中点与目标值的大小不断的将区间范围缩小为原来的一半,最终达到搜索到目标值的效果。

        简单点说,在一个升序的数组内(假设数组内的目标值不重复,重复的在后面解决),如果目标值比数组中间元素的值小,那么我们将原搜索区间(一开始的整个数组)的左半部分看成新的搜索区间;如果目标值比区间中点的值大,则将原搜索区间的右半部分看成新的搜索区间。完成上一步后,我们将获得新的搜索区间,继续比较目标值与新的区间中点的值的大小。这样一直比较下去,就可以得到目标值的位置。

2. 二分法应用

  • 二分求开平方

        在高中我们就了解过用二分法不断逼近一个数开平方的准确值,现在我们用二分查找通过计算机语言实现一个简化版的开方求解。

        要求一个整数a(>0)的平方根,即要求解x² = a中x的值。也就是要求分f(x) = x² - a = 0的根,这个简单的二次函数有两个(不同)解,我们只要其中大于0的那个。也就是说我们要求解的根的下限是0,知道上限就可以尝试用二分法逼近了。又因为大于1的数的平方肯定是大于自身的,所以f(a) = a² - a > 0,f(a) > 0就是说a一定是在根的右边,所以上限就是a。先在我们只要寻找区间中点m,然后比较f(m)是否也在根的右边,如果是,那么他就是新的上限,不是他就是新的下限。

int sqrt(int val)
{
    int head = 0;
    int tail = val;
    int mid,temp;
    while(tail>=head)
    {
        mid = (head+tail)/2;
        temp = mid*mid-val;
        if(temp<=0)
            head = mid+1;
        else
            tail = mid-1;
    }
    
    return tail;   
}

  • 二分搜索单个目标元素 

        如果我们给定一个升序数组和一个目标值,要求在数组中找到目标值,并返回其下标。如果目标值不存在于数组中,则返回它将会被按顺序插入的位置。

        首先看到我们可能回想到用多层嵌套循环来求解,但是那样时间开销太大,在这里我们使用二分法,可以将时

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值