AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79596954
Accepted
CodeCrusader
CodeCrusader
Asked: 2025-04-29 00:52:43 +0800 CST2025-04-29 00:52:43 +0800 CST 2025-04-29 00:52:43 +0800 CST

encontre o comprimento máximo da subsequência com diferença adjacente menor que 2

  • 772

Declaração do problema:

Você recebe uma matriz de inteiros arr de tamanho n.

Selecione uma subsequência de números inteiros e reorganize-os para formar uma sequência circular de modo que a diferença absoluta entre quaisquer dois números inteiros adjacentes (incluindo o último e o primeiro) seja no máximo 1.

Encontre o número máximo de inteiros que podem ser selecionados.

Observações:

Uma subsequência é formada pela exclusão de zero ou mais elementos sem alterar a ordem dos elementos restantes.

Os números inteiros selecionados podem ser reorganizados em qualquer ordem.

A sequência é circular — o último e o primeiro inteiros são considerados adjacentes.

Restrições:

1 <= n <= 2 × 10^5

0 <= arr[i] <= 10^9

Exemplos:

Input: arr = [4, 3, 5, 1, 2, 2, 1]
Output: 5
Explanation: maximum length subsequence is : [3, 1, 2, 2, 1], it can be rearranged to seq : [2, 1, 1, 2, 3] of length 5, note that the condition must be satisfied in circular also, means abs(seq[0] - seq[seq.length-1]) means abs(2-3) <= 0 

Input: arr = [3, 7, 5, 1, 5]
Output: 2
Explanation: maximum length subsequence is : [5,5] of length 2

Input: arr = [2, 2, 3, 2, 1, 2, 2]
Output: 7
Explanation: maximum length subsequence is : [2,2,3,2,1,2,2] of length 7

Input: arr = [1,2,3,4,5]
Output = 2
Explanation: maximum length subsequence is : [1,2] or [2,3] or [3,4] or [4,5], so length is 2. 

Observe que a subsequência também deve satisfazer a condição circular. Aqui está meu código:

import java.util.*;

class Main {
    public static int solve(int[] arr) {
        Map<Integer, Integer> freq = new HashMap<>();
        for (int num : arr) {
            freq.put(num, freq.getOrDefault(num, 0) + 1);
        }

        int max = 0;
        for (int num : freq.keySet()) {
            int count = freq.get(num);
            int countWithNext = freq.getOrDefault(num + 1, 0);
            int countWithPrev = freq.getOrDefault(num - 1, 0);
            max = Math.max(max, countWithPrev + count + countWithNext);
        }

        return max;
    }

    public static void main(String[] args) {
        System.out.println(solve(new int[]{4,3,5,1,2,2,1})); // Expected: 5
        System.out.println(solve(new int[]{3,7,5,1,5})); // Expected: 2
        System.out.println(solve(new int[]{2,2,3,2,1,2,2})); // Expected: 7
        System.out.println(solve(new int[]{1,2,3,4,5})); // Expected: 2
    }
}

Sou capaz de encontrar as subsequências de comprimento máximo, mas não consigo encontrar como atender à condição circular, então, para o caso de teste [1,2,3,4,5], meu código está retornando 5 em vez de 2.

Além disso, a abordagem em si está falhando para a entrada [1,2,3,4,3,2], conforme comentado por John Bollinger

Qual é a abordagem correta para resolver isso com menos complexidade de tempo?

java
  • 2 2 respostas
  • 109 Views

2 respostas

  • Voted
  1. John Bollinger
    2025-04-29T03:46:14+08:002025-04-29T03:46:14+08:00

    Qual é a abordagem correta para resolver isso com menos complexidade de tempo?

    Observe bem a dica de @btilly nos comentários:

    Sua subsequência tem um mínimo, um máximo e cada valor entre eles deve aparecer 2+ vezes.

    Isso é quase uma impressão digital que você pode igualar, mas antes de expandirmos para tal impressão digital, vamos primeiro considerar por que isso acontece.

    Considere um membro s n de uma sequência circular contígua que não é nem seu valor mínimo nem seu valor máximo. Agora, suponha que percorremos o ciclo começando em s n . Antes de retornarmos a s n , percorreremos tanto o mínimo quanto o máximo da sequência e, como a sequência é organizada de forma contígua, entre eles devemos percorrer outro elemento cujo valor é o mesmo que s n . Portanto, todo membro que não é nem mínimo nem máximo na sequência deve ocorrer pelo menos duas vezes.

    O mesmo não se aplica, contudo, ao mínimo ou ao máximo. Pode haver múltiplas ocorrências de um ou de ambos, mas ainda podemos formar um ciclo com apenas uma ocorrência de cada. No caso mais trivial, uma única ocorrência de um único número satisfaz os critérios, mas podemos ter uma única ocorrência de cada um dos valores mínimo e máximo com qualquer número total de elementos diferente de exatamente 3.

    Agora, suponha que temos uma coleção de números contíguos, em qualquer ordem, tal que haja pelo menos duas ocorrências de cada um, exceto possivelmente o mínimo e o máximo entre eles. Podemos formar uma sequência circular a partir deles, primeiro ordenando-os em ordem crescente, depois pegando um de cada número que não é nem mínimo nem máximo e deslocando-os para o final, em ordem decrescente. Por exemplo,

    • começando com 2, 4, 3, 2, 3, 1, 3, 5, 5, 4 ,
    • nós classificamos para obter 1, 2, 2, 3, 3, 3, 4, 4, 5, 5
    • então movemos um 4, um 3 e um 2 para o final para obter 1, 2, 3, 3, 4, 5, 5, 4, 3, 2 , o que satisfaz os requisitos

    Segue-se que, para que uma coleção de números seja adequada para formar o tipo de sequência circular que você deseja, é necessário e suficiente que (i) eles sejam contíguos e (ii) cada número que não seja o mínimo nem o máximo apareça pelo menos duas vezes.

    AGORA você tem sua impressão digital. É possível encontrar a sequência máxima com essa impressão digital em O( n log n ) passos (pior caso), mas deixo você resolver os detalhes.

    • 3
  2. Best Answer
    trincot
    2025-04-29T04:19:43+08:002025-04-29T04:19:43+08:00

    Seu código considera apenas as frequências dos "vizinhos" imediatos (em ordem de classificação) para determinar uma contagem. Isso gerará resultados incorretos quando a resposta correta envolver mais de 3 números distintos.

    Contar frequências é uma boa abordagem, mas depois vá além dos vizinhos diretos do valor em questão. Também será útil procurar vizinhos apenas quando tiver certeza de que está em um limite inferior de um intervalo potencial — dessa forma, você só precisa varrer os valores em ordem crescente . Um valor é considerado "baixo" quando sua frequência é 1 ou não há ocorrência desse valor menos um.

    Veja como o loop (depois de obter as frequências) pode ser feito para funcionar:

            int max = 0;
            for (int num : freq.keySet()) {
                int count = freq.get(num);
                if (count != 1 && freq.containsKey(num-1)) continue;
                // We're at a low end of a range
                int groupCount = count;
                do {
                    num++;
                    count = freq.getOrDefault(num, 0);
                    groupCount += count;
                } while (count > 1);
                max = Math.max(max, groupCount);
            }
            return max;
    

    Supondo que as operações gete putem um mapa hash tenham uma complexidade de tempo amortizada de O(1), esse algoritmo tem uma complexidade de tempo O(𝑛), onde 𝑛 é o tamanho da matriz de entrada.

    • 2

relate perguntas

  • Lock Condition.notify está lançando java.lang.IllegalMonitorStateException

  • Resposta de microsserviço Muitos para Um não aparece no carteiro

  • Validação personalizada do SpringBoot Bean

  • Os soquetes Java são FIFO?

  • Por que não é possível / desencorajado definir um lado do servidor de tempo limite de solicitação?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve