最近招了一个优质员工,组里的脏活累活全让他干。。。

a1a6705f9be0c81598365de5617c592e.gif

(关注数据结构和算法,了解更多新知识)

最近一网友发文称自己公司新招了一位优质员工,所谓的优质员工并不是技术有多厉害,而是该员工的孩子刚出生,媳妇又没工作,还有房贷,所以组里的脏活累活全让他干。

adcd12d84457d27a12c15fa34685d619.png

在这种情况下该员工如果不是富二代,他是断然不敢离职的,以这样的方式欺负别人也是够无耻的,我们来看下各位网友的评论。

8824388973ad828679ea0b594ed2d593.png

--------------下面是今天的算法题--------------

来看下今天的算法题,这题是LeetCode的第240题:搜索二维矩阵 II。这题也是字节的一道面试题,我们来看下。

ea6df6529a5da07a8b5abc6c51d2bcba.png

问题描述

来源:LeetCode第240题

难度:中等

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

1,每行的元素从左到右升序排列。

2,每列的元素从上到下升序排列。

示例1:

12e4ba0979d00bd0e1b3c868a074f7b6.jpeg

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5

输出:true

  • m == matrix.length

  • n == matrix[i].length

  • 1 <= n, m <= 300

  • -10^9 <= matrix[i][j] <= 10^9

  • 每行的所有元素从左到右升序排列

  • 每列的所有元素从上到下升序排列

  • -10^9 <= target <= 10^9

问题分析

这题是让在二维数组中找到目标值target,而二维数组中每一行和每一列都是有序的。我们可以从两个方向查找,一个是左下角一个是右上角。

假如从左下角开始查找,如果查找的值小于target,下一步就往右边找,如果查找的值大于target,下一步就往上边找。

假如从右上角开始查找,如果查找的值小于target,下一步就往下面找,如果查找的值大于target,下一步就往左边找。

能不能从左上角和右下角位置开始查找呢?这个明显是不行的,假如从左上角开始查找,当查找的值小于target的时候,需要往更大的地方查找,而左上角位置的右边和下边都是比原来值大的,究竟该往哪个方向查找呢?这个时候就不好确定了,同理右下角也一样。

我们就从右上角开始查找来看下这题的代码。

JAVA:

public boolean searchMatrix(int[][] matrix, int target) {
    // 从矩阵右上角开始搜索
    int col = matrix[0].length - 1;// 列
    int row = 0;// 行
    while (col >= 0 && row <= matrix.length - 1) {
        if (target == matrix[row][col]) {
            return true;// 如果找到就直接返回
        } else if (target < matrix[row][col]) {
            col--;// 如果查找的值大了,下一步往左找
        } else if (target > matrix[row][col]) {
            row++;// 如果查找的值小了,下一步往下找
        }
    }
    return false;// 如果没找到,返回false
}

C++:

public:
    bool searchMatrix(vector<vector<int>> &matrix, int target) {
        // 从矩阵右上角开始搜索
        int col = matrix[0].size() - 1;// 列
        int row = 0;// 行
        while (col >= 0 && row <= matrix.size() - 1) {
            if (target == matrix[row][col]) {
                return true;// 如果找到就直接返回
            } else if (target < matrix[row][col]) {
                col--;// 如果查找的值大了,下一步往左找
            } else if (target > matrix[row][col]) {
                row++;// 如果查找的值小了,下一步往下找
            }
        }
        return false;// 如果没找到,返回false
    }

C:

bool searchMatrix(int **matrix, int matrixSize, int *matrixColSize, int target) {
    // 从矩阵右上角开始搜索
    int col = *matrixColSize - 1;// 列
    int row = 0;// 行
    while (col >= 0 && row <= matrixSize - 1) {
        if (target == matrix[row][col]) {
            return true;// 如果找到就直接返回
        } else if (target < matrix[row][col]) {
            col--;// 如果查找的值大了,下一步往左找
        } else if (target > matrix[row][col]) {
            row++;// 如果查找的值小了,下一步往下找
        }
    }
    return false;// 如果没找到,返回false
}

Python:

def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
    # 从矩阵右上角开始搜索
    col = len(matrix[0]) - 1  # 列
    row = 0  # 行
    while col >= 0 and row <= len(matrix) - 1:
        if target == matrix[row][col]:
            return True  # 如果找到就直接返回
        elif target < matrix[row][col]:
            col -= 1  # 如果查找的值大了,下一步往左找
        elif target > matrix[row][col]:
            row += 1  # 如果查找的值小了,下一步往下找
    return False  # 如果没找到,返回false

c5ced44c091396e17e23ac1e6cdb93f9.gif

笔者简介

博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构和算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值