用二分查询一个有序向量(或数组)中是否存在vector<T>[i]==i;

0. 下面【1】使用了类,【2】使用了函数

解析:
 

  - 因为我们的代码中不存在l = mid+1;r = mid -1;这种可能会【跨越另一个指针】的情况,所以我们while条件写l+1!=r,言下之意,彼时你俩相差为1,我们就跳出循环了。

  - 跳出时存在两种情况1:r指向的就是答案,2:没有答案,连r指向的都不是答案。

  - 为什么最后检查 r 而不是 l?

  - 在循环结束时,r 总是指向可能的解。L始终指向小于其索引的元素,而 r 指向大于或等于其索引的第一个元素。

  - 因此,如果存在满足条件的元素,它一定在 r 的位置

  - 这种算法特别适用于已排序元素唯一的数组,其中我们要找的是第一个等于其索引的元素。

- 这段代码通过二分查找的思路,可以高效 【它的时间复杂度是 O(log n),比从头到尾遍历效率高多了】地找到了有序向量中第一个(元素本身等于其下标的元素,比如这个题中的3等于其下标3)

- 你可能会遇到的死循环风险: 如果你使用 l < r 作为循环条件,当 l 和 r 相邻时(即 l+1 == r),循环仍然会继续。因为 mid 的值始终会在 l 和 r 之间反复切换,无法收敛。

- 无法处理相邻元素的情况: 当目标元素恰好位于 l 和 r 之间时,使用 l < r 的条件会导致无法找到目标元素。

1.

#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
    int fun(vector<int>& nums) {
        int l = -1, r = nums.size();
        while (l + 1 != r) {
            int mid = l + r >> 1;
            if (nums[mid] < mid)l = mid;
            else r = mid;
        }
        if (nums[r] == r)
          cout << "find the pos is" << r;
        else cout << "-1";
        cout << endl;
        return 0;
    }
};

int main() {
    Solution s;
    vector<int> vec{ -3,-1,1,3,5 };
    s.fun(vec);
}

2.

#include<vector>
#include<iostream>
using namespace std;
int main(){
    vector<int> vec{ -3,-1,1,3,5 };
    int l = -1, r = vec.size();
    while (l+1!=r) {
        int mid = (l+r)/2;
        if (vec[mid] < mid) {
            l = mid;
        }
        else {
            r = mid;
        }
    }
    if (vec[r] == r) {
      cout << "找到了,下标是" << r << endl;
    }
    else {
      cout << "没有找到" << endl;
    }
}

在C++,`std::vector`是一个动态数组,它允许我们存储任意类型的数据。如果你想判断一个数是否在某个范围内的`std::vector`,你可以使用`std::vector`的成员函数`at()`和`size()`来实现。 以下是一个简单的例子,展示了如何使用`std::vector`来判断一个数是否在特定的范围内: ```cpp #include <iostream> #include <vector> int main() { // 创建一个包含一些数字的 std::vector std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9}; // 要查找的数 int number_to_check = 5; // 检查这个数是否在 numbers if (std::find(numbers.begin(), numbers.end(), number_to_check) != numbers.end()) { std::cout << "Number " << number_to_check << " is in the range." << std::endl; } else { std::cout << "Number " << number_to_check << " is not in the range." << std::endl; } return 0; } ``` 这段代码首先创建了一个包含一些数字的`std::vector`,然后检查了要查找的数(这里是5)是否在这个向量。使用`std::find()`函数来查找数字,它会返回一个迭代器,指向第一个匹配的元素。如果找到了匹配的元素,那么它会返回该元素的迭代器;如果没有找到,它会返回`numbers.end()`。通过这种方式,我们可以判断一个数是否在给定的范围内。 需要注意的是,这个方法只能用于向量的连续元素范围查找。如果你的向量的元素不连续或者是有序的,你可能需要使用不同的方法来判断一个数是否在某个范围内。例如,如果向量的元素是有序的,你可以使用二分查找法(Binary Search)来更高效地查找一个数是否在给定的范围内。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值