在有序数组中找到某个数
程序员文章站
2022-03-13 12:27:59
...
条件是数组中可能出现重复的数字,很容易就会想到折半查找,但是对于重复元素怎么处理?
解决方法一:最先想到的就是二分查找找到待查找的数后,若存在相同的数,继续向左查找,直到找到第一个数为止。但是这样最坏的time cost是o(n)。
怎么样可以达到最坏情况下也是o(logn)呢,想到了下面的方法
解决方法二:如果是最左边的数则是我们要找的;否则,right=mid-1继续查找
talk is cheap, show you my code
#include <iostream>
int find_first_num(const vector<int> v, int n)
{
int res = -1;
int left = 0;
int right = v.size() - 1;
while (left <= right)
{
int mid = (left + right) >> 1;
if (v[mid] < n)
{
left = mid + 1;
}
else if (v[mid] > n)
{
right = mid - 1;
}
else
{
if (0 == mid || (mid > 0 && v[mid-1] != v[mid]))
{
res = mid;
break;
}
else
{
right = mid - 1;
}
}
}
return res;
}
int main() {
vector<int> v{1, 2, 3, 3, 6, 9};
cout << find_first_num(v, 3);
vector<int> v1{2, 2, 3, 3, 6, 9};
cout << find_first_num(v, 2);
vector<int> v2{2, 2, 2, 2, 2, 2};
cout << find_first_num(v, 2);
}
运行结果
2
2
1
推荐阅读
-
定义两个一维数组,每个数组随便填充10个元素。输出的数组是两个数组的并集,并且从小到大排好序,不重复。
-
php数组练习之----查询数组中某key的键值相同的个数、数组的格式转换、合并数组
-
java题求代码,4、现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: int newArr[]={1,3,4,5,6,6,5,4,7,6,7,5}
-
在有序旋转数组中找到最小值
-
php数组练习之----查询数组中某key的键值相同的个数、数组的格式转换、合并数组_PHP教程
-
定义两个一维数组,每个数组随便填充10个元素。输出的数组是两个数组的并集,并且从小到大排好序,不重复。
-
PHP,小弟我想用正则表达式得到数组(@中肖,@尖,@地s_3法,@在有)这四个数组元素,不包含@空格
-
自行给定一个从小到大排好序的数组,输入一个数并将其插入到原始数组中,新的数组还是满足从小到大的排列顺序
-
二分法查找一个数字在有序增序数组中的位置
-
3、给定一个数组和一个数字,从数组中找到两个元素,这两个元素的和等于给定的数字