O problema clássico usando uma tabela de pesquisa

Exemplo 1: dois números

Dado um inteiro nums matriz e um alvo valor-alvo, você encontra na matriz e o valor-alvo dos dois inteiros, e regresso ao seu índice de matriz.

Você pode assumir que cada entrada corresponde a apenas uma resposta. No entanto, você não pode voltar a usar o mesmo elemento de matriz.

Use o Find Set abordagem é, a todos os elementos e o índice correspondente são colocados no mapa, então olhar cada target-aexiste no mapa, nas palavras do retorno ae target-ao valor do índice.
No entanto, se há dois elementos idênticos de como fazer? Para fazer isso, eles colocaram no mapa do tempo da sentença off, se não for encontrado nesta mesa look-up ponto target-a, coloque ano mapa; Se for encontrado devolvê-lo.

1. Resumindo Noriyuki número três

Dar-lhe uma matriz de números inteiros contendo os nums n, determina se existem três elementos a, b, c nums de modo que a + B + C = A 0
? Por favor, não satisfazer as condições que você encontrar todos os triplos duplicados.

Nota: A resposta não pode conter triplos duplicados.

Eu pensei por um longo tempo, não somos capazes de ver como pesquisa conjunto para resolver. Com exemplos apenas se parece com nada, mas a abordagem muito diferente.
abordagens diferentes, mas uma coisa é a mesma, isto é, para a, b e encontrar o c, para que b + c == alvo-a.
No entanto, o problema mais difícil é como peso. Depois de tudo, não é exigida pela ordem, então haverá o uso de elementos diferentes, mas os triplos resultantes é o mesmo .
Portanto, tome o seguinte maneira:

  1. Classificação de uma matriz
  2. Deslocação da esquerda para a direita, para cada elemento nums [i], usando o ponteiro duplo para atravessar a encontrar io elemento depois , L o ponto de extremidade esquerda, R apontando para a direita.
  3. Se nums [i]> 0, e a soma dos três não podem necessariamente igual a 0, as extremidades de loop
  4. Se nums [i] == nums [I -1], que indica que o número é repetido e os resultados são repetidos , que devem ignorar
  5. Quando a soma == 0 quando, os nums [L] == os nums [L +. 1] pode levar a duplicar um resultado, deve ignorar, L ++
  6. Quando == 0 SUM, os nums [R & lt] == os nums [-R & lt. 1] pode levar à duplicação resultado, você deve pular, R-

Por que isso pode acontecer? Na verdade, se a lei é a violência, então, quando cada um o próximo ciclo camada vai continuar a recuar a partir do padrão atual , e conhecer a camada atual repetindo elementos serão ignorados, então ele irá evitar a duplicação. Aqui apenas três ciclos de duas camadas por um ponteiro duplo simplificado, mas o método de ênfase é a mesma.
complexidade de tempo: O (n- 2 )

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        Arrays.sort(nums);
        for(int i=0;i<nums.length-2;i++){
            if(nums[i]>0) break;
            if(i>0 && nums[i]==nums[i-1]) {
                continue;
            }
            int l = i+1;
            int r = nums.length-1;
            while(l<r){
                int sum = nums[i]+nums[l]+nums[r];
                if(sum==0){
                    List<Integer> list = new ArrayList<Integer>();
                    list.add(nums[i]);
                    list.add(nums[l]);
                    list.add(nums[r]);
                    while(l<r && nums[l]==nums[l+1]) l++;
                    while(l<r && nums[r]==nums[r-1]) r--;
                    res.add(list);
                    l++;
                    r--;
                }
                else if(sum>0)  r--;
                else l++;
            }
        }
        return res;
    }
}

2. quatro e o número de

Dada uma matriz N de inteiros e um alvo nums alvo, se houver quatro elementos, um nums b, c, e d é determinado de modo a que + A
B + C + d é igual ao valor do alvo? Identificar todos satisfazem as condições do quad e não repetir.

Nota:

A resposta não pode conter quad duplicado.

Comparado a três soma digital, ele não só é necessária na primeira camada e a circulação da colisão entre um ponteiro adicionar uma camada a ele?
Está provado ser possível, mas desta vez tornou-se o ó complexidade (o n- 3 ).

class Solution {
    public List<List<Integer>> fourSum(int[] nums,int target) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        Arrays.sort(nums);
        for(int i=0;i<nums.length-3;i++){   //a
            if(i>0 && nums[i]==nums[i-1]) {
                continue;
            }
            for(int j=i+1;j<nums.length-2;j++){   //b
                if(j>i+1 && nums[j]==nums[j-1]) continue;
                int l = j+1;
                int r = nums.length-1;
                while(l<r){
                    int sum = nums[i]+nums[j]+nums[l]+nums[r];
                    // System.out.println(nums[i]+" "+nums[j]+" "+nums[l]+" "+nums[r]);
                    if(sum==target){
                        List<Integer> list = new ArrayList<Integer>();
                        list.add(nums[i]);
                        list.add(nums[j]);
                        list.add(nums[l]);
                        list.add(nums[r]);
                        while(l<r && nums[l]==nums[l+1]) l++;
                        while(l<r && nums[r]==nums[r-1]) r--;
                        res.add(list);
                        l++;
                        r--;
                    }
                    else if(sum>target)  r--;
                    else l++;
                }
            }
            
        }
        return res;
    }
}

Em terceiro lugar, o número do próximo três e

Dada uma matriz que compreende n inteiros e um alvo nums alvo. Nums identificar os três números inteiros, e um alvo de tal forma que o seu
mais próximo. Os três números e retorno. Cada grupo assume que existe apenas entrada a única resposta.

Por exemplo, tendo em conta as nums Array = [-1,2,1, -4], e alvo = 1.

O alvo mais próximo é três e o número 2. (-1 = 1 + 2 + 2).

E triplicar o número de ideias é o mesmo e o mesmo, a diferença é que aqui não é mais uma comparação de igualdade, mas mais sum-targetque o valor absoluto é menor. Os menores resultados de atualização, antes da otimização de idéias ea mesma coisa.

Exemplo 2: quatro números juntos II

Dado um conjunto de inteiros contendo a lista de quatro A, B, C, D, não é calculado o número de tuplos (i, j, k, l ), de modo a que A [i] + B [j ] + C [K] + D [l] = 0.

A fim de simplificar o problema, todas as A, B, C, D têm o mesmo comprimento N, 0 e N ≤ ≤ 500. Todos os números inteiros na gama de -228 a 228-- entre 1, o resultado final não será superior a 231--1.

Isto é muito simples, com apenas dois de circuito duplo, dupla percorrer todos os primeiros A, o valor de B, e em seguida adicionando a soma e um número correspondente de ocorrências é registrado em um mapa.
Por que deve registrar o número de vezes? Porque o assunto não disse permitido repetir Além disso, o valor acrescentado das duas combinações diferentes também pode ser o mesmo.
O segundo ciclo duplo para percorrer todo o C + D, e, em seguida, ver -C-Dse podem existir no mapa, além de haver o número de ocorrências no total.

Primeiro, palavras a letra ectópica agrupamento

Dada uma matriz de cadeia, letras palavra ectópica juntos. letras palavra ectópica referem-se às mesmas letras, mas dispostos em diferentes cordas.
Exemplo:
Entrada: [ "comer", "chá ", "tan", "comeu", "nat", "bat"],
de saída:
[
[ "ATE", "comer", "TEA"],
[ "NAT "" Tan "],
[" BAT "]
]

A ideia é usar um mapa tabela de pesquisa, que é caracterizado em palavras letras ectópica, de acordo com a ordem alfabética é a mesma string. Portanto, de acordo com a consistência da corda classificadas como chave , para cada um a letra correspondente da palavra na Lista ectópica como um valor .
Que usa java aqui antes vários métodos desconhecidos:

  1. String str = String.valueOf(strArr);Você pode char [] em seqüência.
  2. new ArrayList<>(map.values());mapa de valor pode ser convertido em uma lista.

O código é como se segue: A complexidade de tempo de O (n)

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List<String>> map = new HashMap<>();
        for(int i=0;i<strs.length;i++){
            char[] strArr = strs[i].toCharArray();
            Arrays.sort(strArr);
            String str = String.valueOf(strArr);
            if(map.containsKey(str)){
                map.get(str).add(strs[i]);
            }else{
                List<String> list = new ArrayList<>();
                list.add(strs[i]);
                map.put(str,list);
            }
        }
        return new ArrayList<>(map.values());
    }
}

Número de boomerang: 3 exemplos

Um tuplo (i, j, k) conjunto num plano diferentes pontos n "boomerang" é representado por um ponto, em que a distância entre a distância entre o i e j e i e k são iguais (tendo em conta membros para que o grupo).

Encontrar o número de todos boomerang. Você pode assumir até 500 n, as coordenadas de todos os pontos do intervalo fechado [-10.000, 10.000] in.

Pensando através de cada ponto p, p encontrar todas as distâncias dos outros pontos, então a distância como a chave, para p distância de pontos-chave como o valor. Cada vez que encontrar um novo ponto, pode a mesma distância, e todos os outros pontos da constituição de duas boomerang .
necessidades de loop duplo, complexidade é O (n- 2 ).

class Solution {
    public int numberOfBoomerangs(int[][] points) {
        int ans = 0;
        for(int q=0;q<points.length;q++){
            HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
            for(int w=0;w<points.length;w++){
                if(q!=w){
                    int dis = (points[q][0]-points[w][0])*(points[q][0]-points[w][0])+(points[q][1]-points[w][1])*(points[q][1]-points[w][1]);
                    if(map.containsKey(dis)){
                        int n = map.get(dis);
                        ans += 2*n;
                        map.replace(dis,n+1);
                    }else{
                        map.put(dis,1);
                    }
                }
            }
        }
        return ans;
    }
}
Publicado 60 artigos originais · ganhou elogios 6 · vista 1203

Acho que você gosta

Origin blog.csdn.net/DLC990319/article/details/105055711
Recomendado
Clasificación