La idea de fusionar y ordenar resuelve el problema de la suma pequeña y el problema del par inverso

Bienvenidos a todos para que presten atención a mi

cuenta oficial de WeChat y actualicen el blog sincrónicamente para una fácil visualización. El problema de la suma pequeña y el problema del orden inverso son una extensión del algoritmo de ordenación por combinación. Este blog implementará la solución del problema de suma pequeña y revertirá problema de pedido.

Problema de pequeña suma

  • En una matriz, se suman los números en el lado izquierdo de cada número menor que el número actual, llamado la suma pequeña de esta matriz, encuentre la suma pequeña de una matriz
  • Complejidad temporal O (N * logN), complejidad espacial O (N)
/*
    @Author: lwl2020
	@Date: 2020-5-20
	@Description: 小和问题的实现
*/

#include <iostream>
#include <vector>
#include <ctime>
using namespace std;

class CSmallSum {
    
    
public:
	int smallSum(vector<int>& arr) {
    
    
		if (arr.size() < 2) {
    
    
			return 0;
		}
		return mergeSortProcess(arr, 0, arr.size() - 1);
	}

private:
	int mergeSortProcess(vector<int>& arr, int left, int right) {
    
    
		if (left == right) {
    
    
			return 0;
		}
		int mid = left + ((right - left) >> 1);
		return mergeSortProcess(arr, left, mid)
			+ mergeSortProcess(arr, mid + 1, right)
			+ merge(arr, left, mid, right);
	}

	int merge(vector<int>& arr, int left, int mid, int right) {
    
    
		int tmpL = left;
		int tmpR = mid + 1;
		int res = 0;
		vector<int> help;
		while (tmpL <= mid && tmpR <= right) {
    
    
			// 生成小和的关键一步
			res += arr.at(tmpL) < arr.at(tmpR) ? arr.at(tmpL) * (right - tmpR + 1) : 0;
			help.push_back(arr.at(tmpL) < arr.at(tmpR) ? arr.at(tmpL++) : arr.at(tmpR++));
		}
		while (tmpL <= mid) {
    
    
			help.push_back(arr.at(tmpL++));
		}
		while (tmpR <= right) {
    
    
			help.push_back(arr.at(tmpR++));
		}
		for (int i = 0; i < help.size(); i++) {
    
    
			arr.at(left + i) = help.at(i);
		}
		return res;
	}
};

int main() {
    
    
	vector<int> arr{
    
     1, 3, 4, 2, 5 };
	int res = CSmallSum().smallSum(arr);
	cout << res << endl;

	system("pause");
	return 0;
}

Problema de par inverso

  • En una matriz, si el número de la izquierda es mayor que el número de la derecha, estos dos números forman un par inverso. Imprima todos los pares inversos
  • La solución al problema del orden inverso es muy similar al problema de la suma pequeña, y también es una aplicación extendida de la ordenación combinada
/*
    @Author: lwl2020
	@Date: 2020-5-20
	@Description: 逆序对问题的实现
*/

#include <iostream>
#include <vector>
using namespace std;

class CInversionPair {
    
    
public:
	void inversionPair(vector<int>& arr) {
    
    
		if (arr.size() < 2) {
    
    
			return;
		}
		mergeSortProcess(arr, 0, arr.size() - 1);
	}

private:
	void mergeSortProcess(vector<int>& arr, int left, int right) {
    
    
		if (left == right) {
    
    
			return;
		}
		int mid = left + ((right - left) >> 1);
		mergeSortProcess(arr, left, mid);
		mergeSortProcess(arr, mid + 1, right);
		merge(arr, left, mid, right);
	}

	void merge(vector<int>& arr, int left, int mid, int right) {
    
    
		int tmpL = left;
		int tmpR = mid + 1;
		vector<int> help;
		while (tmpL <= mid && tmpR <= right) {
    
    
			//********** 生成并打印逆序对 **********
			if (arr.at(tmpL) > arr.at(tmpR)) {
    
    
				for (int i = 0; i <= mid - tmpL; i++) {
    
    
					cout << "(" << arr.at(tmpL + i) << ", " << arr.at(tmpR) << ")" << endl;
				}
			}
			//**************************************
			help.push_back(arr.at(tmpL) < arr.at(tmpR) ? arr.at(tmpL++) : arr.at(tmpR++));
		}
		while (tmpL <= mid) {
    
    
			help.push_back(arr.at(tmpL++));
		}
		while (tmpR <= right) {
    
    
			help.push_back(arr.at(tmpR++));
		}
		for (int i = 0; i < help.size(); i++) {
    
    
			arr.at(left + i) = help.at(i);
		}
	}
};

int main() {
    
    
	vector<int> arr{
    
     1, 5, 3, 2, 4 };
	CInversionPair().inversionPair(arr);

	system("pause");
	return 0;
}

Si hay alguna infracción, comuníquese para eliminarla. Si hay un error, corríjame, gracias

Supongo que te gusta

Origin blog.csdn.net/xiao_ma_nong_last/article/details/106231175
Recomendado
Clasificación