复习Day01:数组part01:701. 二分查找、35. 搜索插入位置、367. 有效的完全平方数、69. x的平方根、74. 搜索二维矩阵

之前的blog链接:https://blog.csdn.net/weixin_43303286/article/details/131690654?spm=1001.2014.3001.5501

我用的方法是在leetcode再过一遍例题,明显会的就复制粘贴,之前没写出来就重写,然后从拓展题目中找题目来写。辅以Labuladong的文章看。然后刷题不用CLion了,使用leetcode自带模拟面试环境。

701. 二分查找

直接过,注意边界就好。

相关题目

35.搜索插入位置

leetcode链接:

这里除了需要二分查找,还需要如果target不在数组内,返回待插入的位置。

cpp 复制代码
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left = 0, right = nums.size() - 1;
        int middle = (right - left) / 2 + left;
        int pos = 0;
        while(left <= right){
            middle = (right - left) / 2 + left;
            if(nums[middle] > target){
                right = middle - 1;
            }else if(nums[middle] < target){
                left = middle + 1;
            }else{
                return middle;
            }
        }
        return right + 1;
    }
};

367. 有效的完全平方数

使用二分法,left为1,right为num,找平方根

cpp 复制代码
class Solution {
public:
    bool isPerfectSquare(int num) {
        int left = 1,  right = num;
        while(left <= right){
            int middle = (right - left) / 2 + left;
            if((long)middle * middle < num){
                left = middle + 1;
            }else if((long)middle * middle > num){
                right = middle - 1;
            }else{
                return true;
            }
        }
        return false;
    }
};

69. x的平方根

cpp 复制代码
class Solution {
public:
    int mySqrt(int x) {
        long left = 1, right = x;
        while(left <= right){
            long middle = (right - left) /2 + left;
            if(middle * middle < x){
                left = middle + 1;
            }else if (middle * middle > x){
                right = middle - 1;
            }else{
                return middle;
            }
        }
        return right;
    }
};

跟上面那题差不多,注意返回。

74. 搜索二维矩阵

这题就相当于把一个有序数组存储为一个二维矩阵。可以用二维数组的映射在做。实际上在计算机存储中。二维数组的存储就是按照一维数组来存的。比如下标为(i,j)的元素的一维数组下标就是i * nums0.size + j。

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int sz = matrix.size() * matrix[0].size();
        int left = 0, right = sz - 1;
        while(left <= right){
            int middle = (right - left) / 2 + left;
            //将middle一维下标转化为二维下标
            int mx = middle / matrix[0].size(), my = middle % matrix[0].size();
            if(matrix[mx][my] < target){
                left = middle + 1;
            }else if(matrix[mx][my] > target){
                right = middle - 1;
            }else{
                return true;
            }
        }
        return false;
    }
};

再试试分别比较,做两次二分,想让target与每行最后一个比较, 再在每一行做一个二分:

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>> matrix, int target) {
        auto row = upper_bound(matrix.begin(), matrix.end(), target, [](const int b, const vector<int> &a) {
            return b < a[0];
        });
        if (row == matrix.begin()) {
            return false;
        }
        --row;
        return binary_search(row->begin(), row->end(), target);
    }
};
相关推荐
小欣加油32 分钟前
leetcode56 合并区间
c++·算法·leetcode·职场和发展
lqqjuly41 分钟前
前沿算法深度解析(二)
人工智能·算法·机器学习
徐小夕2 小时前
万字长文!千万级文档 RAG 知识库系统落地实践
前端·算法·github
akunkuntaimei2 小时前
2026年高考数学各省真题及答案(完整版)
算法·高考
Hello:CodeWorld3 小时前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法
8Qi84 小时前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
youngerwang5 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
KaMeidebaby6 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
手写码匠7 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
无限码力7 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试