1.问题定义:
在有序数组中,查找在输入数组满足大于某值a,小于某值b的所有元素。其中a和b可以不在数组中。
2.举例描述:
输入数组eg:{2,7,8,11,16,26,31,33,37,40,45,49}。查找满足大于10小于30的所有数字,则输出的结果为{11,16,31}子集。若查找大于50或小于2则输出空集。
3.线性扫描方式:
复杂度O(n) 从左到右扫描满足条件的区间
4.二分查找方式:
复杂度O(logN)二分查找满足条件的区间,两次二分查找,确定子数组范围。
auto binary_search_left(const vector<int>& nums,int min,int max){
if(nums.empty())
return -1;
int left=0;
int right =nums.size()-1;
auto min_left=-1;
while(left<=right)
{
auto mid=(left+right)/2;
if(nums[mid]<min){
left=mid+1;
continue;
}
if(nums[mid]>max){
right=mid-1;
continue;
}

在有序数组中查找介于a和b之间的元素,原问题为线性扫描O(n),通过二分查找可降至O(logN)。在塔防游戏中,用于优化子弹与怪物的碰撞检测,减少不必要的图形相交计算,提高效率。排序后每帧检测虽可能漏检,但总体提高了碰撞检测的正确性。

1万+

被折叠的 条评论
为什么被折叠?



