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.