在杨氏矩阵中查找一个数字是否存在

杨氏矩阵

有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的.

在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N);

数组:

1  2  3       1  3  4       1  2  3

2  3  4       2  4  5       4  5  6

3  4  5       4  5  6       7  8  9

 1 #include<stdio.h>
 2
 3 #define ROW 3
 4 #define COL 3
 5
 6 int Find_num(int arr[ROW][COL],int num)
 7 {
 8     //从右上角开始查询
 9     int row = 0;
10     int col = COL - 1;
11     while (row < ROW && col<COL)
12     {
13         if (arr[row][col] > num)
14         {
15             //查询左边的数
16             --col;
17         }
18         if (arr[row][col] < num)
19         {
20             //查询下一行
21             ++row;
22         }
23         if (arr[row][col] == num)
24         {
25             break;
26         }
27     }
28     if (arr[row][col] == num)
29     {
30         return 1;
31     }
32     else
33     {
34         return 0;
35     }
36 }
37
38 int main()
39 {
40     //要求时间复杂度小于=O(N),则可以利用杨氏矩阵的一些特性
41     //如果将每一个都数都查找一遍,则最长时间应该为O(row * col)
42     //如果利用每行从左到右是递增的,每列从上到下是递增的这一性质则为O(row + col)
43     int arr[ROW][COL] = { 1,2,3,3,4,5,4,5,6};
44     int num = 0;
45     while (1)
46     {
47         printf("请输入您要查找的数字:\n");
48         scanf("%d", &num);
49         int find_num = Find_num(arr, num);
50         if (find_num == 0)
51         {
52             printf("数字不存在!\n");
53         }
54         else
55         {
56             printf("数字存在!");
57         }
58
59     }
60
61     return 0;
62 }

原文地址:https://www.cnblogs.com/cuckoo-/p/10381190.html

时间: 2024-11-08 20:17:21

在杨氏矩阵中查找一个数字是否存在的相关文章

杨氏矩阵中查找元素

在杨氏矩阵中查找一个元素是否存在 杨氏矩阵即每一行均以递增顺序排列,每列从上到下也为递增顺序 方法一:数组 #include<stdio.h> #include<stdlib.h> #define COLS 3 #define ROWS 3 //要查找只要在找到右上角的元素和输入元素进行比较.如果右上角元素大,即可排除其他行,若小 //,则可排除本行,继续循环,用输入元素和右上角的元素进行比较 int find(int arr[][COLS], int rows, int cols

杨氏矩阵(二维数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字)

题目要求时间复杂度小于O(N) #include<stdio.h> int find(int arr[][3], int *px, int *py,int key) { int x = 0; int y = *py - 1; while ((x < *px) && (y >= 0)) { if (arr[x][y] == key) { //下标由指针带回 *px = x; *py = y; return 0; } else if (arr[x][y] < ke

C语言编程 在杨氏数组中查找数字

题目:杨氏矩阵(一个二维数组,数组的每行从左到右是递增的,每列从上到下是递增的)在这样的数组中查找一个数字是否存在.要求时间复杂度小于O(N); 主要思路:题目要求时间复杂度度不能大于O(N),所以判断次数必须小于遍历一次数组次数.所以从数组的右上角开始判断,若当前元素大于要查找的数字,则跳过当前列查询下一列,若当前元素小于要查找的数,则跳过当前行查找下一行,直至找到或者找不到. eg:此处使用数组arr[3][3]={1,2,3,4,5,6,7,8,9}:1 2 34 5 67 8 9在数组中

杨氏矩阵中的查找

杨氏矩阵 杨氏矩阵中,每行元素是递增的,每列元素也是递增的.即a[i][j]<a[i+1][j]且a[i][j]<a[i][j+1].要在这样的矩阵中查找某个数值元素的位置,复杂度可以达到o(m+n),其中n为矩阵行长度,m为矩阵列长度. 开始我想的是每一行使用二分查找,时间复杂度为O(n * logm) 看到网上使用的定位法,时间复杂度为O(n + m) 首先定位到第一行最后一个元素,如果要查找的数等于这个元素,直接返回true.如果array[i][j]>num,向前寻找,如果arr

(每日算法)LeetCode --- Word Search(矩阵中查找单词)

在矩阵中查找给定的单词是否出现,可以向上.向下.向左和向右查找.不能在一个字母上重复查找. Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically n

一组数据中只有一个数字出现一次,其他数成对出现,找出这个数

一组数据中只有一个数字出现了一次,其他所有数字都是成对出现的,请找出这个数字. (使用位运算) 直接使用异或运算. 代码如下: #include<stdio.h> #include<stdlib.h> int main() { int arr[]={3,5,9,2,5,3,2};  int size=sizeof(arr)/sizeof(arr[0]); int i=0,find=0; for(;i<size;i++) { find^=arr[i];//循环进行异或运算 }

模拟实现在一个字符串中查找一个字符串

在标准库中有一个函数strstr()用于在一个字符串中查找一个规定的字符串,这个函数可以模拟实现一下,代码如下: #include <stdio.h> #include <assert.h> char *my_strstr(const char str[],const char strstr[]) {  int i = 0,j = 0,k = 0;  assert(str != NULL);  assert(strstr != NULL);  for(i = 0;str[i] !=

【C语言】模拟实现strchr函数.即在一个字符串中查找一个字符第一次出现的位置并返回

//模拟实现strchr函数.即在一个字符串中查找一个字符第一次出现的位置并返回 #include <stdio.h> //#include <string.h> #include <assert.h> char* my_strchr(char *dst, char src) { assert(dst); while (*dst != '\0') { if (*dst == src) return dst; dst++; } return 0; } int main()

【c语言】模拟实现strchr函数,功能:在一个字符串中查找一个字符第一次出现的位置,如果没有出现返回NULL

// 模拟实现strchr函数,功能:在一个字符串中查找一个字符第一次出现的位置,如果没有出现返回NULL #include <stdio.h> #include <assert.h> char const* my_strchr(char const *p,char c) { assert(p != NULL); while (*p) { if (*p == c) return p; else p++; } return NULL; } int main() { char *p =