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;
}
- 二分搜索单个目标元素
如果我们给定一个升序数组和一个目标值,要求在数组中找到目标值,并返回其下标。如果目标值不存在于数组中,则返回它将会被按顺序插入的位置。
首先看到我们可能回想到用多层嵌套循环来求解,但是那样时间开销太大,在这里我们使用二分法,可以将时