二位数组中的查找——杨氏矩阵

-------------------------------------------------------------------------------------------------

"杨氏矩阵":即数组元素从左向右依次递增,从上到下依次递增。要想在该数组中查找数,首

先该数组得满足“杨氏矩阵”的特点。为了方便理解我们可以将一个二位数组看作是一个矩阵,假设i

为行,j为列,数组为str,那么只要满足(str[i][j]<str[i][j+1] && str[i][j]<str[i+1][j]),

注意在判断的时候循环只需要循环i-1次即可。

-------------------------------------------------------------------------------------------------

C语言代码:

# include <stdio.h>
# include <stdlib.h>

# define MAX 3      /*定义矩阵大小为3行3列*/       

/*
**给数组赋值,判断是否满足“杨氏矩阵”
**的特点,如果不满足则重新输入数据。
*/
int init(int arr[][MAX])                       
{
     int i = 0, j = 0;
     
     printf("请输入9个整数赋值给该数组:\n");
     for (i = 0; i < MAX; i++)
     {
          for (j = 0; j < MAX; j++)
          {
               scanf("%d",&arr[i][j]);
          }
     }
     
     for (i = 0; i < MAX-1; i++)
     {
          for (j = 0; j < MAX-1; j++)
          {
               if (arr[i][j] >= arr[i][j + 1] || arr[i][j] >= arr[i+1][j])
               {
                    printf("你输入的数组不符合要求,请重新输入\n");
                    return 1;
               }
          }
     }
     
     printf("恭喜你赋值成功\n");
     return 0;
}

/*
**判断x这个数是否存在于该数组中
*/
int insert(const int arr[][MAX], const int x)
{
     int i = 0, j = 0;
     
     for (i = 0; i < MAX; i++)
     {
          for (j = 0; j < MAX; j++)
          {
               if (x == arr[i][j])
               {
                    return 1;
               }
          }
     }
 
     return -1;
}

int main()
{
     int str[MAX][MAX] = { 0 };
     int num = 0, ret = 0;
     int sign = 1;
 
     while (sign)
     {
          sign = init(str);
     }
     
     printf("\n\n请输入要查找的数:");
     scanf("%d",&num);
     ret = insert(str, num);
 
     if (1 == ret)
     {
          printf("恭喜你!!!%d在该数组中\n",num);
     }
     else
     {
          printf("查找失败!!!%d不在数组中!!!\n",num);
     }

     system("pause");
     return 0;
}

------------------------------------------------------------------------------------------------------

干货小知识:

     根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:

V = (-1)^s * M * 2^E  (s是符号、M是有效数字 、E是阶乘)

  (1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
  (2)M表示有效数字,大于等于1,小于2。
  (3)2^E表示指数位。

------------------------------------------------------------------------------------------------------

时间: 2024-09-28 21:00:14

二位数组中的查找——杨氏矩阵的相关文章

剑指offer:二位数组中的查找

准备找实习期间,复习一下数据相关内容,刷刷题. 题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 解题思路: 思路一:由于数组有序,一开始直接想每一行分别用二分来做,结果超时,分析下来这样做的复杂度是O(nlogn). 思路二:换个角度,同样是二分,但是考虑到右上角的数是当前行的最大值,是当前列的最小值,处于一个中间状态.所以每次选择右上角元

二位数组中的查找

1 public class Solution 2 { 3 public bool Find(int target, int[][] array) 4 { 5 if (array != null) 6 { 7 int rowCnt = array.Length - 1; 8 int colCnt = array[0].Length - 1; 9 10 int row = 0; 11 int col = colCnt; 12 13 while (row <= rowCnt && col

【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数

// 二维数组中的查找,杨氏矩阵在一个二维数组中.每行都依照从左到右的递增的顺序排序. // 每列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个数组和一个数.推断数组中是否包括这个数 #include <stdio.h> #define col 4 #define rol 4 int yang(int(*p)[col], int num) { int i = 0; int j = col - 1; while (j+1) { int *q = &(p[i][j]); if

【C语言】二维数组中的查找,杨氏矩阵

//二维数组中的查找,杨氏矩阵 //在一个二维数组中,每行都按照从左到右的递增的顺序排序.每列都按照从上到下递增的顺序排序. //请完成一个函数,输入这样的一个数组和一个数,判断数组中是否包含这个数. #include <stdio.h> #define Col 4 int Yang(int arr[][Col], int val) { int i=0; int j = Col - 1; int tmp = arr[i][j]; //找到左上角的数 while (1) { if (tmp ==

[剑指Offer]5.二维数组中的查找

题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路 [算法系列之三十三]杨氏矩阵 代码 /*--------------------------------------- * 日期:2015-07-19 * 作者:SJF0115 * 题目: 5.二维数组中的查找 * 网址:http://www.nowcoder.com/books/coding-interviews/a

[Jobdu] 题目1384:二维数组中的查找

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数. 输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字. 接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每

【剑指Offer面试题】二维数组中的查找

下决心AC所有剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有好处的.加油~ 二维数组中的查找 时间限制:1 秒内存限制:32 兆 特殊判题:否提交:19005解决:3642 题目描述: 在一个

【剑指Offer面试题】九度OJ1384:二维数组中的查找

下决心AC全部剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有优点的.加油~ 题目链接地址: http://ac.jobdu.com/problem.php?pid=1384 二维数组中的查找

剑指Offer面试题:2.二维数组中的查找

一.题目:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 例如下面的二维数组就是每行.每列都递增排序.如果在这个数组中查找数字7,则返回true:如果查找数字5,由于数组不含有该数字,则返回false. 二.解题思路 首先选取数组中右上角的数字.如果该数字等于要查找的数字,查找过程结束:如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查