C语言——oj刷题——杨氏矩阵

目录

[1. 理解杨氏矩形的特点](#1. 理解杨氏矩形的特点)

[2. 实现杨氏矩形查找算法](#2. 实现杨氏矩形查找算法)

[3. 编写示例代码](#3. 编写示例代码)


当我们谈到杨氏矩形时,我们指的是一种在二维数组中查找目标元素的高效算法。它是由杨氏(Yan Shi)教授提出的,因此得名为杨氏矩形。

杨氏矩形问题的场景是这样的:给定一个有序的二维数组,每一行从左到右递增,每一列从上到下递增。我们需要在这个二维数组中快速查找某个目标元素是否存在。

为了更好地理解和解决这个问题,我们将分为以下几个步骤进行讲解和编码示例:

  1. 理解杨氏矩形的特点
  2. 实现杨氏矩形查找算法
  3. 编写示例代码

1. 理解杨氏矩形的特点

杨氏矩形的特点是每一行从左到右递增,每一列从上到下递增。这意味着我们可以通过比较目标元素和当前元素的值来缩小查找范围。

具体来说,我们可以从矩形的右上角开始查找。如果目标元素比当前元素大,则目标元素必然不在当前元素的同一行,因此可以排除当前元素所在的行;如果目标元素比当前元素小,则目标元素必然不在当前元素的同一列,因此可以排除当前元素所在的列。通过这种方式,我们可以逐步缩小查找范围,直到找到目标元素或查找范围为空。

2. 实现杨氏矩形查找算法

基于上述特点,我们可以设计一个高效的杨氏矩形查找算法,具体步骤如下:

  • 初始化当前元素为矩形的右上角元素
  • 循环执行以下步骤:
    • 如果当前元素等于目标元素,则返回找到目标元素的位置
    • 如果目标元素比当前元素大,则将当前元素下移一行
    • 如果目标元素比当前元素小,则将当前元素左移一列
  • 如果循环结束仍未找到目标元素,则返回未找到的结果

3. 编写示例代码

下面是一个使用C语言编写的示例代码,演示如何实现杨氏矩形查找算法:

cpp 复制代码
#include <stdio.h>
#include <stdbool.h>

bool yangsMatrixSearch(int matrix[3][3], int target) {
    int rows = 3; // 矩阵的行数
    int cols = 3; // 矩阵的列数

    // 初始化当前元素为矩阵的右上角元素
    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) {
            row++; // 目标元素比当前元素大,下移一行
        } else {
            col--; // 目标元素比当前元素小,左移一列
        }
    }

    return false; // 未找到目标元素
}

int main() {
    int matrix[3][3] = {
        {1, 4, 7},
        {2, 5, 8},
        {3, 6, 9}
    };
    int target = 5;

    bool found = yangsMatrixSearch(matrix, target);

    if (found) {
        printf("目标元素 %d 存在于矩阵中\n", target);
    } else {
        printf("目标元素 %d 不存在于矩阵中\n", target);
    }

    return 0;
}

在上述示例代码中,我们定义了一个**yangsMatrixSearch**函数,该函数接受一个二维数组(矩阵)和目标元素作为参数。函数内部实现了杨氏矩形查找算法。

在**main函数中,我们定义了一个3x3的矩阵和一个目标元素。然后,调用yangsMatrixSearch**函数来查找目标元素是否存在于矩阵中,并根据查找结果打印相应的信息。

希望这篇博客能够帮助你理解杨氏矩形问题,并提供了详细的讲解和代码示例。如果有任何疑问,请随时向我提问。

相关推荐
sp_fyf_202433 分钟前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
ChoSeitaku1 小时前
链表交集相关算法题|AB链表公共元素生成链表C|AB链表交集存放于A|连续子序列|相交链表求交点位置(C)
数据结构·考研·链表
偷心编程1 小时前
双向链表专题
数据结构
香菜大丸1 小时前
链表的归并排序
数据结构·算法·链表
jrrz08281 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
oliveira-time1 小时前
golang学习2
算法
@小博的博客1 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
南宫生2 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步3 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
DARLING Zero two♡3 小时前
关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧
c语言·开发语言·科技