Fortuna base izquierda ley class3- encontrar el número del título matriz 9 en las filas están ordenadas

Fortuna base izquierda ley class3- encontrar el número del título matriz 9 en las filas están ordenadas

1. Tema

[Título] Dada una matriz de M * N número entero matriz y un num número entero, cada fila y cada columna de la matriz están ordenadas. Implementar una función, K se determina si la matriz. Por ejemplo: {{1,3,5,6}, {2,5,7,9}, {4,6,8,10}} Si num es 7, devuelve verdadero; si K es 11, devuelve falso.
[Requisitos] Tiempo de complejidad de O (N + M), la complejidad espacio adicional es O (1).

2. Análisis

En circunstancias normales solamente O (N + M), entonces tenemos que encontrar un número de partida no se puede llegar desde la complejidad de un conjunto de números de un conjunto de preguntas y pregunta estado de los datos que se pide para encontrar algunas ideas de solución.
Este problema puede ser de la situación de los datos conocidos de cada fila de cada columna se clasifican bien, entonces omitir parte innecesaria de recorrido. Como se muestra a continuación, es de desplazamiento asumido desde la esquina superior derecha, 6> 4, 6 debido a la fila y la columna de ubicación se clasifican, por lo que el menor 9,10 6 4 imposible de encontrar porque son más grandes que 6, Naturaleza mayor que 4. Por lo tanto la eliminación de proceso innecesario.
Aquí Insertar imagen Descripción

Así que la idea de esta pregunta es la siguiente:
(1) Busca la esquina superior derecha, si el número actual es mayor que num, el número actual continúa mirando hacia la izquierda, si el número actual es de menos de num, continuar por el número de búsqueda actual. Si el recuento actual es igual al verdadero retorno;
(2) Dado que sólo mirar hacia adelante y hacia abajo a la izquierda, luego atraviesan la condición de que el número del alcance actual de la matriz completa, se inicia desde la parte superior derecha, entonces, quecur_col >= 0 && cur_row <= M -1

Aquí Insertar imagen Descripción

código 3. núcleo

Encuentra en el num arr, cur_col es una longitudinal, cur_row transversal coordenadas.

bool findnum(int arr[][N],int num)
{
	int cur_col = N - 1;
	int cur_row = 0;
	while(cur_col >= 0 && cur_row <= M -1)
	{
		if(arr[cur_row][cur_col] < num)
		{
			cur_row++;
		}
		else if(arr[cur_row][cur_col] > num)
		{
			cur_col--;
		}
		else
			return true;
	}
	return false;

}

4. El código completo

#include<iostream>
#define M 3
#define N 4
using namespace std;

bool findnum(int arr[][N],int num)
{
	int cur_col = N - 1;
	int cur_row = 0;
	while(cur_col >= 0 && cur_row <= M -1)
	{
		if(arr[cur_row][cur_col] < num)
		{
			cur_row++;
		}
		else if(arr[cur_row][cur_col] > num)
		{
			cur_col--;
		}
		else
			return true;
	}
	return false;

}

int main()
{
	int arr[M][N] = {{1,3,5,6},{2,5,7,9},{4,6,8,10}};
	cout<<findnum(arr,4)<<endl;

	system("pause");
	return 0;
}

5. La salida

Desde el inicio de atravesar 6, pasa por el 5,3,5,2, y finalmente encontró 4, devuelve verdadero, imprimir 1.
Aquí Insertar imagen Descripción

Publicado 51 artículos originales · ganado elogios 1 · vistas 1382

Supongo que te gusta

Origin blog.csdn.net/shi_xiao_xuan/article/details/103709810
Recomendado
Clasificación