IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode 240 -> 正文阅读

[数据结构与算法]leetcode 240

思路一:二分搜索

1.由于矩阵行和列都是从小到大排序的,容易发现,matrix[x][y]>=matrix[i][j],其中0<=i<x<m,0<=j<y<n;matrix[x][y]<=matrix[i][j],其中x<i<m,y<j<n。
2.由1可知,我们可以将矩阵分成4个部分,上下左右,如果确定matrix[x][y]<target<matrix[x+1][y+1],则可以确定target只能出现在左下角矩阵或者右上角矩阵。
3.由2我们可以总结出一种递归的解法

实现
记矩阵当前最左上角元素(x1,y1)、右下角元素(x2,y2)
1.如果x1>x2或者y1>y2,则该子矩阵不存在,故找不到target,返回false
2.记中间行mid为(y1+y2)/2,则在mid行中确定分界点(x,y),使得matrix[x-1][mid]<target,matrix[x-1][mid]>target。
3.递归搜索左下角子矩阵(x1,mid+1)(x-1,y2)和右上角子矩阵(x,y1)(x2,mid)

代码:

class Solution {
public:
    bool partSearch(vector<vector<int>>& matrix,int target,int x1,int y1,int x2,int y2)
    {
        if(x1>x2||y1>y2)
            return false;
        int mid=(y1+y2)/2;
        int i=x1;
        for(i=x1;i<=x2;i++)
        {
            if(matrix[mid][i]>target)
                break;
            else if(matrix[mid][i]==target)
                return true;
        }
        return partSearch(matrix,target,x1,mid+1,i-1,y2)||partSearch(matrix,target,i,y1,x2,mid-1);
    }
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m1=matrix.size();
        int n1=matrix[0].size();
        return partSearch(matrix,target,0,0,n1-1,m1-1);
    }
};

思路二:

1.从最左下角元素(x,y)开始搜索
2.如果当前元素等于target,则找到;如果小于target,则向上走一步,也就是y–,根据思路一的1总结出的特性,(x,y)是子矩阵(0,0) (x,y)最大元素,左边没路走,只能往上面走;如果大于target,则向右走一步,(x,y)是子矩阵(x,y) (m-1,n-1)最小元素,下面的路已经走过,只能往右边走。

代码:

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m1=matrix.size();
        int n1=matrix[0].size();
        int x=m1-1;
        int y=0;
        while(x>=0&&x<m1&&y>=0&&y<n1)
        {
            if(matrix[x][y]>target)
            {
                x--;
            }
            else if(matrix[x][y]==target)
            {
                return true;
            }
            else
            {
                y++;
            }
        }
        return false;
    }
};
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-29 10:33:19  更:2021-09-29 10:34:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 11:11:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码