• lc[数组]---706.二分查找


    给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

    示例 1:

    1. 输入: nums = [-1,0,3,5,9,12], target = 9
    2. 输出: 4
    3. 解释: 9 出现在 nums 中并且下标为 4

    示例 2:

    1. 输入: nums = [-1,0,3,5,9,12], target = 2
    2. 输出: -1
    3. 解释: 2 不存在 nums 中因此返回 -1
    • 你可以假设 nums 中的所有元素是不重复的。
    • n 将在 [1, 10000]之间。
    • nums 的每个元素都将在 [-9999, 9999]之间。

     收获:

            ①二分法的前提条件:数组是有序数组&&数组中无重复元素

            ②循环不变量规则:要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。

    写法一:[left, right] left==right是有意义的,是需要判断mid对应位置是不是target

            例: left=1 right=1  对于左闭右闭的区间[1,1]是合法区间的

            且if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1

    1. class Solution
    2. {
    3. public:
    4. int search(vector<int>& nums, int target)
    5. {
    6. int l=0,r=nums.size()-1;
    7. while(l<=r)//防止
    8. {
    9. int mid=l+(r-l)/2;
    10. if(nums[mid]>target)
    11. r=mid-1;
    12. else if(nums[mid]
    13. l=mid+1;
    14. else
    15. return mid;
    16. }
    17. return -1;
    18. }
    19. };

    写法二: target 是在一个在左闭右开的区间里,也就是[left, right)        

    例:left=1 right=1对于左闭右开区间 [1,1)并不是一个合法区间!故left

    • while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
    • if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
      1. // 版本二
      2. class Solution {
      3. public:
      4. int search(vector<int>& nums, int target) {
      5. int left = 0;
      6. int right = nums.size(); // 定义target在左闭右开的区间里,即:[left, right)
      7. while (left < right) { // 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
      8. int middle = left + ((right - left) >> 1);
      9. if (nums[middle] > target) {
      10. right = middle; // target 在左区间,在[left, middle)中
      11. } else if (nums[middle] < target) {
      12. left = middle + 1; // target 在右区间,在[middle + 1, right)中
      13. } else { // nums[middle] == target
      14. return middle; // 数组中找到目标值,直接返回下标
      15. }
      16. }
      17. // 未找到目标值
      18. return -1;
      19. }
      20. };

    相关题目:

  • 相关阅读:
    大学刚毕业,如何才能拿到月薪10K+的offer?
    Unity(Android)——实现手机摇杆和自由移动
    Linux 命令
    移动端文字异常放大解决方法
    通过PreparedStatement预防SQL注入
    【复杂网络】网络科学导论学习笔记-第五章节点重要性与相似性
    RabbitMQ
    《自然语言处理实战:利用Python理解、分析和生成文本》读书笔记:第3章 词中的数学
    IDEA Rogstry中找不到compiler.automake.allow.when.app.running问题解决
    Linux内存管理(四):内存架构和内存模型简述
  • 原文地址:https://blog.csdn.net/zjjaibc/article/details/126727498