Old Wei ganha a oferta para levá-lo para aprender --- série título Brush (dispostos em uma matriz 33. O menor número)

33. A matriz disposta no menor número

problema:

Ele contém apenas o número de factores primos 2, 3 e 5 é referido como o número de feio (Número feio). Por exemplo 6,8 vários feio, mas não 14, porque ele contém sete fatores primos. Tradicionalmente temos 1 como o primeiro número feio. Procura ascendente através N sequência número grande feio.

solução:

pensou:

Fácil de entender a explicação:
Em primeiro lugar, a partir da definição do feio sabemos, apenas um número de fatores 2,3,5 feio, tão feio número p = 2 ^ x * 3 ^ y * 5 ^ z, em outras palavras, um número feia constante feio multiplicado por outro número é multiplicado por 2 ou 3 ou multiplicado por 5, então partimos de uma multiplicação 2,3,5, 2,3,5 ficar feia número três, de três em multiplicado pelo número de partida feia 2,3,5 4,6,10,6,9,15,10,15,25 ficar feia número nove, descobrimos que o número de feio *** esta maneira de obter repetitivo, mas nós título requer o número de tH-N de desordem feio, feio número de tais métodos são obtidos. Em seguida, pode manter a três filas de:
(1) o número de matriz feio: 1
multiplicando a coorte 2: 2
fila multiplicado por 3: 3
por 5 filas: 5
selecciona a mais pequena do número cabeça três fila feia da matriz adicionou-se 2 enquanto que o número mínimo é multiplicado por três filas em 2,3,5;
(2) da matriz feio: 1,2
multiplicado pela fila 2: 4
filas multiplicado por 3: 3,6
multiplicado por 5 fila: 5,10
seleccione três filas menor número 3 adicionou feia cabeça da matriz, enquanto que o número mínimo é multiplicado por três filas em 2,3,5;
(3) o número de matriz feio: 1,2,3
fila multiplicado por 2: 4,6
multiplicando o grupo 3: 6,9
multiplicando a coorte 5: 10, 15 de
selecção de um número mínimo de três filas à frente da matriz 4 foi adicionado feio, enquanto que o número mínimo de 2,3,5 multiplicado em três filas;
(4) o número de matriz feio: 1,2,3,4
fila multiplicada 2: 6,8
multiplicado pela fila 3: 6, 9
vezes 5 a fila: 5,10,15,20
Selecção de um mínimo de três filas feio adicionados à frente do número da matriz 5, enquanto que o número mínimo é multiplicado por três filas em 2,3,5;
(5) o número de matriz feio: 1,2,3,4,5
fila multiplicado por 2: 6,8,10,
multiplicado por três filas: 6,9,12,15
fila multiplicado por 5: 10,15,20,25
selecção de um número mínimo de três filas de antecedência foram adicionados 6 feio da matriz, mas descobrimos que há duas filas de cabeça 6, por isso pop dois cabeça da fila, enquanto que 12,18,30 em três filas;
........................
perguntas:
1. por que fila de três?
Número de série feia do número deve ser ordenada, porque somos de uma matriz feio algumas das 2,3,5 multiplicado pelo número mínimo de eleito não deve multiplicado por 2, 3, do que no passado, ao mesmo tempo para três fila interna, multiplicado por dois, três, foram colocados em ordem cronológica, de modo que a mesma fila interna é ordenada;
2. Porque é o número mínimo de três filas de cabeça relativamente feio para o número de matrizes?
Porque três é ordenada fila, a cabeça é extraído três menor, é equivalente ao número de todas as três filas para encontrar o menor.
Realização de idéias:
não temos necessidade de manter três filas, gravou somente três ponteiros indicam que passo para alcançar; "|" representa um ponteiro, arr feio representam o número de matrizes;
(1) 1
| 2
| 3
| 5
actualmente ponteiro para 0,0 , 0, RRA cabeça fila [0] * 2 = 2, RRA [0] = * 3. 3, RRA [0] * = 5. 5..
(2) 1 2.
2. | 4
|. 3. 6
|. 5 10
1,0,0 ponteiro actual para o ARR cabeça fila * = 2. 4, RRA [0] = * 3. 3, RRA [0] = 5. 5 * [1.]..
(3). 3. 1 2.
2 |. 6. 4
. 3 |. 6 . 9
|. 5 10 15
ponteiro pontos actuais 1,1,0, na cabeça da fila arr [1] * 2 = 4 , arr [1] * 3 = 6, arr [0] * 5 = 5

código python:

# -*- coding:utf-8 -*-
class Solution:
    def GetUglyNumber_Solution(self, index):
        # write code here
        
        if(index<=0):
            return 0
        ugly_num=[1]
        index_first=0
        index_third=0
        index_five=0
        
        for _ in range(index-1):
            newugly=min(ugly_num[index_first]*2,ugly_num[index_third]*3,ugly_num[index_five]*5)
            ugly_num.append(newugly)
            if(newugly%2==0):
                index_first+=1
            if(newugly%3==0):
                index_third+=1
            if(newugly%5==0):
                index_five+=1
                
        return ugly_num[-1]
Publicado 160 artigos originais · ganhou elogios 30 · vê 70000 +

Acho que você gosta

Origin blog.csdn.net/yixieling4397/article/details/104988875
Recomendado
Clasificación