leetcode34:在排序数组中查找元素的第一个和最后一个位置

题目链接:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        if(nums.empty()) {
            return {-1, -1};
        }
        vector<int> ResultPos;
        int left = 0, right = nums.size() - 1;
        int first = -1, second = -1;
        while(left <= right)
        {
            int mid = left + (right - left) / 2;
            if(nums[mid] == target)
            {
                first = mid;
                right = mid - 1;
            } 
            else if(nums[mid] > target)
            {
                right = mid - 1;
            }
            else
            {
                left = mid + 1;
            }
        }

        left = 0, right = nums.size() - 1;
        while(left <= right)
        {
            int mid = left + (right - left) / 2;
            if(nums[mid] == target)
            {
                second = mid;
                left = mid + 1;
            }
            else if(nums[mid] > target)
            {
                right = mid - 1;
            }
            else
            {
                left = mid + 1;
            }
        }
        ResultPos.push_back(first);
        ResultPos.push_back(second);
        return ResultPos;
    }
};

 这个代码让我对于二分法有了重新的认识,也就是假如说,以往找的都是数组中全都不同数的某一个数,而这个题目是数组中有相同的找第一个位置的。

我就拿查找某一个元素的第一个位置为例

int left = 0, right = nums.size() - 1;
        int first = -1, second = -1;
        while(left <= right)
        {
            int mid = left + (right - left) / 2;
            if(nums[mid] == target)
            {
                first = mid;
                right = mid - 1;
            } 
            else if(nums[mid] > target)
            {
                right = mid - 1;
            }
            else
            {
                left = mid + 1;
            }
        }

这个代码我原本以为是只能找到中间就截止了,但其实我想过,while里面的条件就是left  <= right

所以就算你找到了相同的元素,但是只要left <= right,那就不会停止搜索,所以让right往左移,找到第一个。这里讲一下为什么是right = mid - 1而不是left = mid + 1, 其实你想想,要是想找到前面的,是不是得需要一个指针往前走,那么这个也就是right = mid - 1;同理,想找到某一个元素的最后一个位置的话,那就得用left = mid + 1去找。

最近更新

  1. TCP协议是安全的吗?

    2024-06-19 10:04:04       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-19 10:04:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-19 10:04:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-19 10:04:04       18 阅读

热门阅读

  1. kotlin 注解 @Parcelize 使用

    2024-06-19 10:04:04       12 阅读
  2. Hadoop+Spark大数据技术(自命题试卷测试)

    2024-06-19 10:04:04       11 阅读
  3. Bash sleep随机时间

    2024-06-19 10:04:04       9 阅读
  4. elasticsearch安装(centos7)

    2024-06-19 10:04:04       6 阅读
  5. Vue3使用component动态展示组件

    2024-06-19 10:04:04       7 阅读
  6. 前端面试题——网络篇

    2024-06-19 10:04:04       6 阅读
  7. 数据传输安全(为支付宝第三方做铺垫)

    2024-06-19 10:04:04       9 阅读
  8. HTML(6)——表单

    2024-06-19 10:04:04       8 阅读
  9. 【数据结构】练习集

    2024-06-19 10:04:04       6 阅读
  10. template标签

    2024-06-19 10:04:04       7 阅读
  11. Springboot应用设置跳过SSL证书认证

    2024-06-19 10:04:04       8 阅读