3sum - Notas de Aprendizagem

3sum - Notas de Aprendizagem

título

Leetcode acima problema 3sum .
Olhando de uma dada disposição de três números, de tal modo que o número de três e igual ao valor alvo (alvo)

pensamento

Primeiro, podemos colocar o problema em problema 2Sum 3sum . Para cada número no num array, só precisamos encontrar os outros dois números, de modo que os dois números é igual a (alvo - num).

Tal abordagem terá um pequeno problema, neste momento, se há o mesmo número de dois ou mais, então o número vai obter o mesmo resultado, desta forma cada vez que julgaria deve primeiro obter uma solução não é a mesma. Para abordar esta questão, nós primeiro ordenar o array , o mesmo número estão concentrados em um só.

Há um método muito simples para classificar um conjunto de boa demanda 2Sum, por exemplo:

Matriz: [1,3,5,6,7,9]
alvo :. 11

Primeiro encontrar o mínimo 1, máximo de 9. Adicionando-se a 10, inferior a 11, o valor mínimo neste momento não é possível encontrar um valor mais elevado de tal modo que satisfaz (1 + num = 11), de modo a exclusão 1.

Matriz: [3,5,6,7,9]
alvo :. 11

3 continua a encontrar o mínimo, o máximo, soma de dois 9 12, maior do que 11, o valor máximo não pode ser encontrado neste momento para satisfazer um valor menor (9 + num = 11), 9 omitido.

Matriz: [3,5,6,7]
alvo :. 11

Repetir até que os dois valores são encontradas igual a 11.

código

void Fun(int *nums, int length, int target) {
	if (nums == NULL || length < 3)
		return;

	// 排序
	sort(nums, nums + length);

	//对每个值进行寻找,将3Sum 转化为2Sum问题
	for (int i = length - 1; i > 1;) {
		int min = 0;
		int max = i - 1;

		while (min < max) {
			int num = nums[min] + nums[max];

			//最大值最小值之和小于目标值时,删去最小值
			//最大值最小值之和小于目标值时,删去最大值
			if (num < target - nums[i]) {
				while (min < max&&nums[min] == nums[++min]);
			}
			else if (num > target - nums[i]) {
				while (min < max&&nums[max] == nums[--max]);
			}
			else {
				cout << target << "=" << nums[min] << "+" 
				     << nums[max] << "+" << nums[i] << endl;
				while (min < max&&nums[min] == nums[++min]);
				while (min < max&&nums[max] == nums[--max]);
			}
		}

		//排除相同值,避免重复
		while (i > 1 && nums[i] == nums[--i]);
	}
}

propagação

2Sum também pode usar uma tabela hash para resolver a complexidade é O (n).
3sum complexidade de O (n ^ 2), se não, então o método.

Publicado 63 artigos originais · ganhou elogios 73 · vê 70000 +

Acho que você gosta

Origin blog.csdn.net/jjwwwww/article/details/86477191
Recomendado
Clasificación