当前位置: 首页 > article >正文

C/C++ 每日一练:在矩阵中查找特定值

        本次练习将解决一个经典问题——在一个二维矩阵中查找特定的值。通过这个练习,可以更好地掌握二维数组的操作,以及优化算法的设计。


题目要求

        给定一个二维矩阵 matrix,每行从左到右递增排序,每列从上到下递增排序,以及一个目标值 target。编写一个函数来判断目标值是否存在于矩阵中。如果存在,返回 true;否则,返回 false。

示例

输入:
matrix = [
  [1, 4, 7, 11],
  [2, 5, 8, 12],
  [3, 6, 9, 16],
  [10, 13, 14, 17]
]
若target = 5,输出:true

若target = 20,输出:false

解题思路

观察特性

  • 每行从左到右递增,每列从上到下递增。
  • 如果选择右上角或左下角的元素作为起点,可以通过比较值和 target,决定移动方向。

算法设计

  • 从矩阵的右上角开始:
    • 如果当前值等于 target,返回 true。
    • 如果当前值大于 target,向左移动(减少列号)。
    • 如果当前值小于 target,向下移动(增加行号)。
  • 如果越界,则说明 target 不在矩阵中,返回 false。

时间复杂度分析

  • 最多需要遍历一行和一列,总体复杂度为 O(m + n),其中 m 和 n 分别为矩阵的行数和列数。

示例代码

C 实现

#include <stdio.h>
#include <stdbool.h>

// 查找目标值是否存在于矩阵中
bool searchMatrix(int matrix[][4], int rows, int cols, int target) {
    int row = 0;            // 从第一行
    int col = cols - 1;     // 最后一列开始

    while (row < rows && col >= 0) 
    {
        if (matrix[row][col] == target) 
        {
            return true;    // 找到目标值
        } else if (matrix[row][col] > target) {
            col--;          // 当前值大于目标值,向左移动
        } else {
            row++;          // 当前值小于目标值,向下移动
        }
    }
    return false;           // 遍历结束未找到目标值
}

int main() 
{
    int matrix[4][4] = {
        {1, 4, 7, 11},
        {2, 5, 8, 12},
        {3, 6, 9, 16},
        {10, 13, 14, 17}
    };
    int target = 5;

    if (searchMatrix(matrix, 4, 4, target)) {
        printf("Target %d found in the matrix.\n", target);
    } else {
        printf("Target %d not found in the matrix.\n", target);
    }

    return 0;
}

C++ 实现

#include <iostream>
#include <vector>

using namespace std;

// 查找目标值是否存在于矩阵中
bool searchMatrix(vector<vector<int>>& matrix, int target) {
    int rows = matrix.size();           // 矩阵的行数
    int cols = matrix[0].size();        // 矩阵的列数
    int row = 0;                        // 从第一行
    int col = cols - 1;                 // 最后一列开始

    while (row < rows && col >= 0) 
    {
        if (matrix[row][col] == target) {
            return true;                // 找到目标值
        } else if (matrix[row][col] > target) {
            col--;                      // 当前值大于目标值,向左移动
        } else {
            row++;                      // 当前值小于目标值,向下移动
        }
    }
    return false;                       // 遍历结束未找到目标值
}

int main() 
{
    vector<vector<int>> matrix = {
        {1, 4, 7, 11},
        {2, 5, 8, 12},
        {3, 6, 9, 16},
        {10, 13, 14, 17}
    };
    int target = 5;

    if (searchMatrix(matrix, target)) {
        cout << "Target " << target << " found in the matrix." << endl;
    } else {
        cout << "Target " << target << " not found in the matrix." << endl;
    }

    return 0;
}


http://www.kler.cn/a/417772.html

相关文章:

  • ping请求超时是为什么?怎么解决
  • 会议直击|美格智能亮相2024紫光展锐全球合作伙伴大会,融合5G+AI共拓全球市场
  • 看华为,引入IPD的正确路径
  • vscode中json文件的注释飘红
  • Redis进行性能优化可以考虑的一些策略
  • 多线程篇-3--java内存模型(主内存,共享内存,三大特性,指定重排)
  • 异步处理优化:多线程线程池与消息队列的选择与应用
  • Linux - web服务器
  • 算法——反转字符串二(leetcode541)
  • 在Java中使用Apache POI导入导出Excel(四)
  • JMeter参数化redis
  • 【特殊子序列 DP】力扣2501. 数组中最长的方波
  • 【MATLAB源码-第225期】基于matlab的计算器GUI设计仿真,能够实现基础运算,三角函数以及幂运算。
  • 具体的技术和工具在县级融媒体建设3.0中有哪些应用?
  • Zookeeper选举算法与提案处理概览
  • Spring Boot 集成 Knife4j 的 Swagger 文档
  • Unity 超链接文本类
  • 【Oracle11g SQL详解】GROUP BY 和 HAVING 子句:分组与过滤
  • 2062:【例1.3】电影票(https://ybt.ssoier.cn/problem_show.php?pid=2062)
  • 【SPIE出版|四大高校联合举办】先进算法与图像处理技术国际学术会议(IC-AAIP 2025)
  • 十一月第五周python内容
  • 深入理解ARP(三)
  • 【人工智能】深入解析GPT、BERT与Transformer模型|从原理到应用的完整教程
  • 牛客真题:魔法数字变换:JAVA
  • 忘记设备IP 使用 nmap遍历查找设备IP
  • JDK、JRE、JVM的区别