los programadores de la entrevista de oro - preguntas cara 16.16 ordenación parcial (tipo / no-tipo)

1. Tema

Dada una matriz de enteros, escribir una función para identificar el índice m y n, siempre y cuando el índice del intervalo [m, n-] elementos ordenados, se ordena toda la matriz.
Nota: nm minimizar en la medida de lo posible, es decir, encontrar la secuencia más corta de la calificación.
La función devuelve un valor de [m, n-], y si hay m n (por ejemplo, toda la matriz se ordena), retorno a [-1, -1].

示例:
输入: [1,2,4,7,10,11,7,12,6,7,16,18,19]
输出: [3,9]
提示:
0 <= len(array) <= 1000000

Fuente: estancia botón (LeetCode)
enlace: https: //leetcode-cn.com/problems/sub-sort-lcci
propiedad de la deducción de todas las redes. reimpresión comercial póngase en contacto con la reimpresión autorizada oficial, no comercial por favor indique la fuente.

2. Resolución de Problemas

2.1 Clasificación

  • Una copia de la matriz original, ordenar la copia matriz
  • El contraste de dos matrices, mirada a diferentes intervalos puede ser parte de lo
class Solution {
public:
    vector<int> subSort(vector<int>& array) {
    	vector<int> sortArray(array);
        sort(sortArray.begin(), sortArray.end());
        vector<int> ans;
        int i = 0;
        while(i < array.size() && array[i]==sortArray[i])
        	++i;
        if(i < array.size())
        	ans.push_back(i);
        i = array.size()-1;
        while(i >= 0 && array[i]==sortArray[i])
        	--i;
        if(i >= 0)
        	ans.push_back(i);
        if(ans.size()==2)
        	return ans;
        return {-1,-1};
    }
};

472 ms 40,4 MB

2.2 no se ordenan

  • Atravesando de izquierda a, máximo izquierda derecha MAX> número actual, hay ciertamente necesita clasificar, actualizaciones en tiempo real MAX, encontrar el lugar adecuado para ser ordenada
  • Traverse de derecha a izquierda, el número actual> a la derecha del mínimo MIN, sin duda hay que solucionar, actualizaciones en tiempo real MIN, se fue a buscar el punto izquierdo
class Solution {
public:
    vector<int> subSort(vector<int>& array) {
    	if(array.size() < 2)
    		return {-1,-1};
    	int lmax = array[0], rmin = array[array.size()-1];
    	int left = -1, right = -1, n = array.size();
    	for(int i = 1; i < n; ++i)
    	{
    		if(array[i] < lmax)
    		{
    			right = i;
    		}
    		lmax = max(lmax, array[i]);
    		if(array[n-1-i] > rmin)
    		{
    			left = n-i-1;
    		}
    		rmin = min(rmin, array[n-1-i]);
    	}
    	return {left, right};
    }
};

156 ms 39,1 MB

Publicados 805 artículos originales · ganado elogios 1520 · Vistas de 370.000 +

Supongo que te gusta

Origin blog.csdn.net/qq_21201267/article/details/105303198
Recomendado
Clasificación