复习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 * nums[0].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);
    }
};
相关推荐
学地理的小胖砸5 分钟前
【高分系列卫星简介——高分一号(GF-1)】
开发语言·数码相机·算法·遥感·地理信息
oliveira-time6 分钟前
C++ prime plus-7-編程練習
算法
MogulNemenis41 分钟前
力扣150题——多维动态规划
算法·leetcode·动态规划
繁依Fanyi1 小时前
使用 Spring Boot + Redis + Vue 实现动态路由加载页面
开发语言·vue.js·pytorch·spring boot·redis·python·算法
aloha_7892 小时前
B站宋红康JAVA基础视频教程(chapter14数据结构与集合源码)
java·数据结构·spring boot·算法·spring cloud·mybatis
临沂堇2 小时前
CCF刷题计划——训练计划(反向拓扑排序)
数据结构·c++·算法·拓扑·ccf
铁匠匠匠2 小时前
【C总集篇】第八章 数组和指针
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
Unicorn建模2 小时前
2024“华为杯”中国研究生数学建模竞赛(E题)深度剖析|数学建模完整过程+详细思路+代码全解析
python·算法·数学建模
咕咕吖2 小时前
二叉树的层序遍历(c)
数据结构·算法
子非鱼9213 小时前
【JavaScript】LeetCode:41-45
开发语言·javascript·leetcode·链表·二叉树