[Problema de programación] Ajuste de la partición de la matriz

Problema:
Dada una matriz ordenada arr, ajuste arr para que la mitad izquierda de la matriz no tenga elementos repetidos y esté en orden ascendente, sin asegurarse de que la parte derecha esté en orden.
Por ejemplo: arr = [1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 8, 9]
después del ajuste arr = [1, 2, 3, 4 , 5, 6, 7, 8, 9,…]
Requisitos: La complejidad del tiempo es O (n), la complejidad del espacio es O (1)
Descripción de entrada:

第一行一个整数 N,表示数组长度,接下来一行 N 个整数,表示数组内元素

Descripción de salida:

输出 N 个整数为答案数组

Análisis: El
espacio solicitado es muy tacaño. Obviamente, no podemos reabrir un espacio para almacenamiento. En este momento, necesitamos usar la función swap (). Para esto necesitamos dos punteros, uno para apuntar al elemento actual ay otro Se usa para señalar el elemento intercambiado b.

Dado que la matriz dada ya está en orden, si los elementos apuntados por los dos punteros son los mismos, todos los elementos entre los dos punteros son iguales; si son diferentes, se demuestra el orden y las posiciones de los dos punteros deben actualizarse para que a alcance la posición de b (como una nueva fuente de comparación) y b se
mueva hacia atrás.

Código:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    
    
	int n;
	cin >> n;
	vector<int> v;
	for(int i=0;i<n;i++)
	{
    
    
		int x;
		cin >> x;
		v.push_back(x);
	}
	//左指针与右指针
	int a = 0, b = 1;
	//长度小于2可直接输出
	if(n<=2)
	{
    
    
		cout << v[a] << " " << v[b];
	}
	else
	{
    
    
		while (b!=n)
		{
    
    
			//如果两个数不同,则需要进行交换
		    //记得对左加一,因为左指针现在指的还是相同的数,也是第一个出现的数
			//而如果是连续不同,其交换的是自己的位置
			if(v[a]!=v[b])
			{
    
    
				swap(v[++a], v[b]);
			}
			//无论是否相同,都需要对比下一个数
			b++;
		}
	}
	for(int i=0;i<n;i++)
	{
    
    
		cout << v[i] << " ";
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_43530773/article/details/115060117
Recomendado
Clasificación