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

[c语言日寄]在不完全递增序中查找特定要素

在这里插入图片描述

【作者主页】siy2333
【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是进阶开发者,这里都能满足你的需求!
【食用方法】1.根据题目自行尝试 2.查看基础思路完善题解 3.学习拓展算法
【Gitee链接】资源保存在我的Gitee仓库:https://gitee.com/siy2333/study


文章目录

  • 前言
  • 一、题目引入
    • 不完全递增矩阵
    • 问题描述
  • 二、知识点分析
  • 三、解法实现与分析
    • 1. 暴力搜索
    • 2. 逐行二分查找
  • 四、总结


前言

查找类问题是一个非常常见的任务。无论是从简单的数组中查找一个特定的数字,还是从复杂的数据结构中检索信息,查找算法的效率和正确性都十分重要。今天,我们将探讨一个有趣的查找问题:在不完全递增序的矩阵中查找特定的元素。


一、题目引入

不完全递增矩阵

假设我们有一个二维矩阵,矩阵的每一行从左到右是递增的,但列与列之间并没有严格的递增关系。这种矩阵被称为“不完全递增序矩阵”。

例如,以下矩阵满足这一条件

1357
2468
10111213
9141516

在这个矩阵中,每一行都是递增的,但列与列之间并不完全递增

问题描述

给定一个不完全递增序的矩阵和一个目标数字,编写一个程序来判断该数字是否存在于矩阵中。
假设矩阵如下,而且目标数字为 12:

1357
2468
10111213
9141516

此时,程序返回 true。

二、知识点分析

  1. 矩阵的特性
    矩阵的每一行从左到右是递增的,这意味着我们可以利用这一特性来优化查找算法。虽然列与列之间没有严格的递增关系,但行的递增性仍然可以为我们提供一些线索。我们在接下来的文章中会利用这一点解题。
  2. 查找算法
    在完全有序的矩阵中,我们可以从右上角或左下角开始查找,利用矩阵的有序性逐步缩小搜索范围(例如二分查找)。然而,在不完全递增序的矩阵中,这种方法不再适用。我们需要寻找一种新的策略来优化查找过程。
  3. 时间复杂度
    对于一个 M×N 的矩阵,暴力搜索的时间复杂度为 O(M×N)。

三、解法实现与分析

1. 暴力搜索

最简单的查找方法是暴力搜索,即遍历矩阵的每一个元素,检查是否等于目标值。这种方法的时间复杂度为 O(M×N),效率较低。

#include <stdio.h>
#include <stdbool.h>#define M 4
#define N 4//暴力查找函数
bool find_brute_force(int matrix[M][N], int target) {for (int i = 0; i < M; i++) {for (int j = 0; j < N; j++) {if (matrix[i][j] == target) {return true;}}}return false;
}
//主函数
int main() {//定义数组int matrix[M][N] = {{1, 3, 5, 7},{2, 4, 6, 8},{10, 11, 12, 13},{9, 14, 15, 16}};int target = 12;//查找与输出if (find_brute_force(matrix, target)) {printf("Target %d found in the matrix.\n", target);} else {printf("Target %d not found in the matrix.\n", target);}return 0;
}

运行结果如下:
请添加图片描述

2. 逐行二分查找

虽然矩阵的列没有严格的递增关系,但每一行的递增性可以被利用。我们可以对每一行进行二分查找。这种方法的时间复杂度为 O(MlogN)

#include <stdio.h>
#include <stdbool.h>#define M 4
#define N 4bool binary_search(int arr[], int target) {int left = 0, right = N - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return true;} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return false;
}bool find_row_wise(int matrix[M][N], int target) {for (int i = 0; i < M; i++) {if (binary_search(matrix[i], target)) {return true;}}return false;
}int main() {int matrix[M][N] = {{1, 3, 5, 7},{2, 4, 6, 8},{10, 11, 12, 13},{9, 14, 15, 16}};int target = 12;if (find_row_wise(matrix, target)) {printf("Target %d found in the matrix.\n", target);} else {printf("Target %d not found in the matrix.\n", target);}return 0;
}

运行结果如下:
请添加图片描述

四、总结

通过分析条件的特性,选择合适的查找算法和数据结构,是程序员的重要素质。对于这道题,即不完全递增序的矩阵,逐行二分查找是一种有效的优化策略。

关注窝,每三天至少更新一篇优质c语言题目详解~

[专栏链接QwQ] :⌈c语言日寄⌋CSDN
[关注博主ava]:siy2333
感谢观看~ 我们下次再见!!

http://www.lryc.cn/news/536283.html

相关文章:

  • Golang的多团队协作编程模式与实践经验
  • cv2.Sobel
  • Windows软件自动化利器:pywinauto python
  • 关于 IoT DC3 中驱动(Driver)的理解
  • LogicFlow自定义节点:矩形、HTML(vue3)
  • 多模态本地部署ConVideoX-5B模型文生视频
  • html 点击弹出视频弹窗
  • 业务干挂数据库,Oracle内存分配不足
  • MongoDB 7 分片副本集升级方案详解(下)
  • Webpack相关优化总结
  • ollama实践笔记
  • springCloud-2021.0.9 之 服务调服务 示例
  • 如何使用DHTMLX Scheduler的拖放功能,在 JS 日程安排日历中创建一组相同的事件
  • QxOrm生成json
  • XS9922B(CHIPUP) 模拟高清 寄存器手册 XS9922B 四通道 多合一模拟高清解码芯片
  • Django创建超管用户
  • 基于Kotlin中Flow扩展重试方法
  • 好好说话:深度学习扫盲
  • 【状态空间方程】对于状态空间方程矩阵D≠0时的状态反馈与滑模控制
  • 腾讯大数据基于 StarRocks 的向量检索探索
  • Linux系统调用
  • 如何在Servlet容器中使用HttpServletResponse?
  • SpringCloud - Seata 分布式事务
  • Ansible批量配置服务器免密登录步骤详解
  • 互联网大厂中面试的高频计算机网络问题及详解
  • 人工智能时代下ai智能语音机器人如何以假乱真?
  • 【橘子ES】Aggregations 聚合准备
  • vue3读取webrtc-stream 视频流
  • springcloud集成gateway
  • 2025常用的SEO工具有哪些?