Last active
October 5, 2020 00:14
-
-
Save erickvieira/0352b2a19e7baccd4b270821b73c4b10 to your computer and use it in GitHub Desktop.
Sequência maximal de um array de inteiros.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <math.h> | |
#include <stdbool.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
// = IMPLEMENTACAO DE ARRAY DINAMICO =========================================== | |
typedef struct { | |
int *arranjo; | |
size_t quantidadeDeElementos; | |
size_t espacoEmMemoria; | |
} Arranjo; | |
void inicializarArranjo(Arranjo *a, size_t tamanhoInicial) { | |
a->arranjo = malloc(tamanhoInicial * sizeof(int)); | |
a->quantidadeDeElementos = 0; | |
a->espacoEmMemoria = tamanhoInicial; | |
} | |
void inserirNoArranjo(Arranjo *a, int elemento) { | |
if (a->quantidadeDeElementos == a->espacoEmMemoria) { | |
a->espacoEmMemoria *= 2; | |
a->arranjo = realloc(a->arranjo, a->espacoEmMemoria * sizeof(int)); | |
} | |
a->arranjo[a->quantidadeDeElementos++] = elemento; | |
} | |
int obterElemento(Arranjo *a, int posicao) { | |
if (a->quantidadeDeElementos > posicao) { | |
return a->arranjo[posicao]; | |
} else { | |
return 0; | |
} | |
} | |
int obterTamanhoDoArranjo(Arranjo *a) { return a->quantidadeDeElementos; } | |
void destruirArranjo(Arranjo *a) { | |
free(a->arranjo); | |
a->arranjo = NULL; | |
a->quantidadeDeElementos = a->espacoEmMemoria = 0; | |
} | |
// = FIM DA IMPLEMENTACAO DE ARRAY DINAMICO ==================================== | |
int sequenciaMaximal(Arranjo valores) { | |
Arranjo sequencias; | |
int tam = obterTamanhoDoArranjo(&valores); | |
inicializarArranjo(&sequencias, tam); | |
int soma, valor, indice, maiorSequencia; | |
soma = valor = indice = maiorSequencia = 0; | |
bool sequenciaQuebrada = false; | |
for (indice = 0; indice < tam; indice++) { | |
valor = obterElemento(&valores, indice); | |
soma += valor; | |
if (soma < 0) { | |
soma = 0; | |
} | |
inserirNoArranjo(&sequencias, soma); | |
} | |
soma = 0; | |
for (indice = 0; indice < tam; indice++) { | |
soma = obterElemento(&sequencias, indice); | |
maiorSequencia = soma > maiorSequencia ? soma : maiorSequencia; | |
} | |
destruirArranjo(&sequencias); | |
return maiorSequencia; | |
} | |
int main() { | |
Arranjo arr; | |
inicializarArranjo(&arr, 10); | |
inserirNoArranjo(&arr, 3); | |
inserirNoArranjo(&arr, -4); | |
inserirNoArranjo(&arr, 6); | |
inserirNoArranjo(&arr, 3); | |
inserirNoArranjo(&arr, -5); | |
inserirNoArranjo(&arr, 6); | |
inserirNoArranjo(&arr, 10); | |
inserirNoArranjo(&arr, -9); | |
inserirNoArranjo(&arr, -2); | |
inserirNoArranjo(&arr, 8); | |
printf("%d\n", sequenciaMaximal(arr)); | |
destruirArranjo(&arr); | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Função de complexidade O(n²) focada em encontrar a maior sequência números | |
* inteiros que geram uma soma positiva dentro de um arranjo. | |
* @param {...number} valores - Arranjo de números inteiros. | |
* @returns {number} a maior sequência/soma encontrada no arranjo. | |
*/ | |
function sequenciaMaximal(...valores) { | |
let soma = 0; | |
let sequenciaQuebrada = false; | |
const sequencias = valores.reduce((acumulador, valor) => { | |
soma += valor; | |
sequenciaQuebrada = soma < 0; | |
if (sequenciaQuebrada) { | |
soma = 0; | |
} | |
return [...acumulador, soma]; | |
}, []); | |
return sequencias.reduce((maiorSequencia, sequencia) => { | |
return (maiorSequencia = | |
sequencia > maiorSequencia ? sequencia : maiorSequencia); | |
}, 0 /* VALOR INICIAL DA VARIAVEL maiorSequencia */); | |
} | |
const resultado = sequenciaMaximal(3, -4, 6, 3, -5, 6, 10, -9, -2, 8); | |
console.log(resultado); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment