二维数组中的查找

简介: 二维数组中的查找

文章目录

二维数组中的查找

面试题3:

image.png

似题:

我做过这个类似的有杨氏矩阵为背景的,实际上是一样的

暴力遍历

二维数组暴力遍历的话时间复杂度为O(n2)

虽然暴力但是应付学校考试这个就是一把好手

#include<stdio.h>
//const 就是因为二维数组是定死的
int search(const int arr[4][4], int num,unsigned int* prow,unsigned int* pcol)
{
  int i = 0;
  //扫描行
  for (i = 0; i < *prow; i++)
  {
    //扫描列
    int j = 0;
    for (j = 0; j < *pcol; j++)
    {
      //与所查数比较判断,有一样的就直接返回
      if (arr[i][j] == num)
      {
        *prow = i;//把坐标传回去
        *pcol = j;
        return 1;//一次返回,之后就不看了,因为已经证明到有这个数了,没必要在做无用功了
      }
    }
  }
  return 0;
}
int main()
{
  int arr[4][4] = { {1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15} };
  int num = 0;
  while (1)
  {
    unsigned int row = sizeof(arr) / sizeof(arr[0]);
    unsigned int col = sizeof(arr[0]) / sizeof(arr[0][0]);   //把row,col拉进来就是为了每次再来是更新一次
    //长宽,因为下面我们就是用row,col变量没有用其他变量
    printf("请输入你想要找的数:>");
    scanf("%d", &num);
    if (search(arr, num, &row, &col))//把长宽传地址过去用指针prow,pcol接收
    {
      printf("有这个数\n");
      printf("坐标为(%d,%d)\n", row, col);
    }
    else
    {
      printf("没有这个数\n");
    }
  } 
  return 0;
}

image.png

动态基点操作

暴力操作肯定拿不下面试官的心,没有思想,应该优化程序,减小时间复杂度

image.png

image.png

image.png


然后把上面search函数改改就可以了

时间复杂度也降为O(n)

#include<stdio.h>
//const 就是因为二维数组是定死的
int search(const int arr[4][4], int num,unsigned int* prow,unsigned int* pcol)
{
  int i = 0;
  unsigned int x = 0;
  unsigned int y = *pcol-1;
  while ((x<*prow)&&(y>=0))
  {
    if (arr[x][y] - num > 0)
    {
      y--;
    }
    else if (arr[x][y] - num < 0)
    {
      x++;
    }
    else
    {
      *prow = x;
      *pcol = y;
      return 1;
    }
  }
  return 0;
}
int main()
{
  int arr[4][4] = { {1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15} };
  int num = 0;
  while (1)
  {
    unsigned int row = sizeof(arr) / sizeof(arr[0]);
    unsigned int col = sizeof(arr[0]) / sizeof(arr[0][0]);   //把row,col拉进来就是为了每次再来是更新一次
    //长宽,因为下面我们就是用row,col变量没有用其他变量
    printf("请输入你想要找的数:>");
    scanf("%d", &num);
    if (search(arr, num, &row, &col))//把长宽传地址过去用指针prow,pcol接收
    {
      printf("有这个数\n");
      printf("坐标为(%d,%d)\n", row, col);
    }
    else
    {
      printf("没有这个数\n");
    }
  } 
  return 0;
}

image.png

结果也是不错的


目录
相关文章
|
1月前
|
存储 索引
数组的特点
数组是一种线性数据结构,用于存储固定大小的顺序集合。每个元素在数组中都有一个唯一的索引,可以快速访问和修改。数组支持随机访问,但插入和删除操作较慢,因为需要移动后续元素。适用于需要频繁读取数据的场景。
|
6月前
|
存储 C++ 索引
c++数组
c++数组
59 2
|
5月前
|
存储 算法 编译器
数组(1)
数组(1)
35 0
|
6月前
|
存储 搜索推荐 算法
C数组
C数组
34 0
|
6月前
|
存储 C++ 索引
C++数组
C++数组
55 0
|
存储 机器学习/深度学习 Java
原来这就是数组
原来这就是数组
80 0
|
6月前
|
存储 C语言
数组
数组。
27 0
|
6月前
|
存储 程序员 C++
c++数组详细介绍(一)
前言 深入理解C++的数组和字符串是成为熟练C++程序员的重要一步。本文将探索C++中数组和字符串的基本概念,从基础到进阶,包括数组的声明、初始化、访问和多维数组的操作,以及字符串类的使用和与字符数组的转换。还将涉及异常处理、动态内存分配、STL中的其他容器、常用字符串操作。
116 0
|
6月前
|
存储 C++
C++-数组总结
C++-数组总结
48 0
数组相关练习
数组相关练习
53 0
下一篇
无影云桌面