二分查找和双指针
2023-12-31 21:15:30
一、二分查找
例:在一个升序的数组中,查找target。
①确定查找范围,设置i = 0;j = n - 1;
②然后折半,(i + j)/2,判断该索引位置的值与目标值大小
③若是相等则就找到了,大的话目标值就在左半段,小的则在有半段。
④直至( j < i )还没找到target,则没有。
例:假如,该数组有多个target,我想要位置最左边的那个。
public static int binarySearch(int[] a,int target){
int i = 0,j = a.length - 1;
int candidate = -1;
while(i <= j){
int m = (i + j) >>> 1;
if(terget < a[m]){
j = m - 1;
}else if(a[m] < target){
i = m + 1;
}else {
candidate = m;
j = m - 1;
}
}
return candidate;
}
二分查找最左边的那个值。
如果只要普通二分查找将candidate变量删去,target == a[m] 时,直接返回索引。
当然,知道了二分查找找最左边那个值,要是我想找左右边的那个值呢,将第二个else语句的j = m - 1,换成j = m + 1即可。
题:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为?
O(log n)
?的算法。
public int searchInsert(int[] nums, int target) {
int i = 0,j = nums.length - 1;
while(i <= j){
int m = (i + j) >>> 1;
if(target < nums[m]){
j = m - 1;
}else if(nums[m] < target){
i = m + 1;
}else {
return m;
}
}
return i;
}
?二、双指针
文章来源:https://blog.csdn.net/woai3364/article/details/135300154
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!