Soluții Leetcode Python
Soluții Leetcode Python
Introducere 1.1
Listă Legată 1.2
Ciclul listei înlănț uite 1.2.1
Inversează lista înlănț uită 1.2.2
Ș terge un Nod într-o Listă Înregistrată 1.2.3
Îmbină două liste sortate 1.2.4
Intersecț ia a Două Liste Legate 1.2.5
Ciclul Listei Înlănț uite II 1.2.6
Listă legată palindromă 1.2.7
Îndepărtaț i elementele din lista înlănț uită 1.2.8
Eliminarea duplicatelor din lista legată sortată 1.2.9
Elimină duplicatele din lista legată sortată II 1.2.10
Schimbă nodurile în perechi 1.2.11
Eliminaț i nodul N de la sfârș itul listei 1.2.12
Copaci 1.3
Parcurgere Preorder 1.3.1
Iterator BST 1.3.2
Traversare Inorder 1.3.3
Arbore Simetric 1.3.4
Arbore Binare Echilibrat 1.3.5
Cea mai apropiată valoare din BST 1.3.6
Parcurgere postorder 1.3.7
Adâncimea maximă a arborelui binar 1.3.8
Inversează arborele binar 1.3.9
Aceeaș i arbore 1.3.10
Cel mai mic strămoș comun al unui arbore de căutare binar 1.3.11
Cel mai mic strămoș comun într-un arbore binar 1.3.12
1
Arbori de Căutare Binari Unici 1.3.13
Arborele Binare de Căutare Unic II 1.3.14
Suma Căii 1.3.15
Suma maximă a căii din arborele binar 1.3.16
Parcurgerea arborilor binari pe niveluri 1.3.17
Validaț i arborii de căutare binară 1.3.18
Adâncimea minimă a unui arbore binar 1.3.19
Transformă un array sortat într-un arbore binar de căutare 1.3.20
Aplatizaț i arborele binar într-o listă legată 1.3.21
Construiț i un arbore binar din traversarea înordine ș i preordine 1.3.22
Cărț ile Binară 1.3.23
Recuperaț i arborele binar de căutare 1.3.24
Suma Căii II 1.3.25
Parcurgerea în ordine de nivel binar II 1.3.26
K-a cel mai mic element într-un BST 1.3.27
Construieș te un arbore binar din parcurgerea în ordine ș i parcurgerea în postordine 1.3.28
Vedere din partea dreaptă a arborelui binar 1.3.29
Suma numerelor de la rădăcină la frunză 1.3.30
Parcurgerea în ordine zigzag a unui arbore binar 1.3.31
Hotul de case III 1.3.32
Succesor în ordine în BST 1.3.33
Secvenț a consecutivă cea mai lungă din arborele binar 1.3.34
Verificarea secvenț ei preordine în Arborele de Căutare Binare 1.3.35
Arbore Binární Cu Susul În Jos 1.3.36
Numără Subarborele Unival 1.3.37
Serializare ș i Deserializare a Arborelui Binare 1.3.38
Grafice 1.4
Numărul de componente conectate într-un graf neorientat 1.4.1
Programul cursului 1.4.2
Graf arbore valid 1.4.3
2
Programul cursurilor 2 1.4.4
Numărul insulelor 1.4.5
Heap-uri 1.5
Îmbină K liste legate sortate 1.5.1
Cel de-al K-lea element cel mai mare dintr-un tablou 1.5.2
Arregi 1.6
2 Sum II 1.6.1
2 Suma III 1.6.2
Conț ine duplicate 1.6.3
Rotează Array 1.6.4
3 Sume Mai Mici 1.6.5
3 Suma Aproape 1.6.6
3 Sumă 1.6.7
Două Sume 1.6.8
Plus Un 1.6.9
Cel mai bun moment pentru a cumpăra ș i a vinde acț iuni 1.6.10
Distanț a cea mai scurtă între cuvinte 1.6.11
Mută zerourile 1.6.12
Conț ine duplicate II 1.6.13
Element majoritar 1.6.14
Eliminaț i duplicatele dintr-un tablou sortat 1.6.15
Suma Greutăț ii Listelor Înglobate 1.6.16
Suma Ponderată a Listei Înglobate II 1.6.17
Elimină elementul 1.6.18
Intersecț ia a două array-uri II 1.6.19
Îmbinaț i tablourile sortate 1.6.20
Inversarea vocalelor dintr-un ș ir 1.6.21
Intersectia a Două Arne 1.6.22
Containerul cu cea mai multă apă 1.6.23
Produsul Array, cu excepț ia Sinelui 1.6.24
3
Capcana pentru apă de ploaie 1.6.25
Subsirul maxim 1.6.26
Cel mai bun timp pentru a cumpăra ș i a vinde acț iuni II 1.6.27
Găseș te minimul într-un array sortat rotit 1.6.28
Triunghiul lui Pascal 1.6.29
Triunghiul lui Pascal II 1.6.30
Intervale rezumative 1.6.31
Numărul lipsă 1.6.32
Ș iruri 1.7
Anagram valid 1.7.1
Palindrom valabil 1.7.2
Model de cuvinte 1.7.3
Paranteze valide 1.7.4
Stringuri izomorfe 1.7.5
String invers 1.7.6
Manipularea biț ilor 1.8
Suma a două numere întregi 1.8.1
Număr singular 1.8.2
Numărul Unic II 1.8.3
Numărul unic III 1.8.4
Matematică 1.9
Inversarea întregului 1.9.1
Număr palindrom 1.9.2
Pow(x,n) 1.9.3
Submulț imi 1.9.4
Submulț imi II 1.9.5
Fraction la Decimal Recursiv 1.9.6
Numărul coloanei foii Excel 1.9.7
Titlu Coloană Foaie Excel 1.9.8
Zero-uri finale ale factorialului 1.9.9
4
Număr fericit 1.9.10
Numără Primele 1.9.11
Plus Unu 1.9.12
Împarte două întregi 1.9.13
Înmulț iț i ș iruri 1.9.14
Puncte maxime pe o linie 1.9.15
Produsul tabloului cu excepț ia de sine 1.9.16
Puterea celor Trei 1.9.17
Împărț irea întregului 1.9.18
Puterea celor patru 1.9.19
Adaugă cifre 1.9.20
Număr urât 1.9.21
Numărul urât II 1.9.22
Număr Super Urât 1.9.23
Găsiț i K perechi cu cele mai mici sume 1.9.24
Autoîncruciș are 1.9.25
Pictaț i gardul 1.9.26
Comutator de Becuri 1.9.27
Jocul Nim 1.9.28
Matriț ă 1.10
Roteș te imaginea 1.10.1
Setaț i matricea cu zero 1.10.2
Căutaț i într-o matrice 2D 1.10.3
Caută o matrice 2D II 1.10.4
Matrice spiralată 1.10.5
Matricea spirală II 1.10.6
Design 1.11
Cache LRU 1.11.1
5
Introducere
6
Ciclul Listei Înlănț uite
URL: [Link]
returnează Fals
7
Ciclul din Lista Legată
8
Inversează lista legată
URL:[Link]
altfel:
temp = None
next_node = None
în timp ce head != None:
next_node = [Link]
[Link] = temp
temp = cap
cap = nod_urmator
returna ț i temp
9
Ș terge nodul dintr-o listă legată
URL: [Link]
10
Îmbină două liste sortate
Îmbinaț i două liste legate sortate ș i returnaț i-o ca o nouă listă. Noua listă ar trebui să fie
realizat prin îmbinarea nodurilor din primele două liste.
URL:[Link]
11
Fuzionarea a două liste sortate
dacă l1 != None:
[Link]ătorul = l1
dacă l2 != None:
[Link] = l2
return [Link]
12
Îmbină două liste sortate
13
Intersecț ia a două liste legate
A: a1 → a2↘c1 → c2 → c3↗
B: b1 → b2 → b3 încep să se intersecteze la nodul c1.
Notes:
Dacă cele două liste legate nu au nicio intersecț ie, întoarce null. Listele legate trebuie să
îș i păstrează structura originală după ce funcț ia returnează. Poț i presupune că există
nu există cicluri nicăieri în întreaga structură legată. Codul tău ar trebui să ruleze, de preferinț ă
în timp O(n) ș i foloseș te doar O(1) memorie.
URL: [Link]
14
Intersecț ia a două liste legate
len_b = 0
curent = capA
în timp ce current != None:
curent = [Link]
len_a += 1
current = headB
în timp ce current != None:
curent = [Link]ător
len_b += 1
diff = 0
current = None
dacă len_a > len_b:
diff = len_a - len_b
currentA = headA
currentB = headB
altfel:
diff = len_b - len_a
currentA = headB
currentB = headA
count = 0
în timp ce numărul este mai mic decât diferen ț a:
currentA = [Link]
count += 1
15
Ciclul listei legate II
Dat fiind o listă legată, returnaț i nodul unde începe ciclul. Dacă nu există ciclu,
return null.
URL: [Link]
16
Ciclul în Lista Încatenată II
altfel:
fast = head
slow = head
has_cycle = False
în timp ce fast != None ș i [Link] != None:
lento = [Link]
rapid = [Link]ă[Link]ătoare
slow = head
în timp ce rapid != lent:
rapid = [Link]ător
slow = [Link]
întoarcere lentă
17
Listă legată palindromă
URL:[Link]
18
Lista înlănț uită palindromă
altfel:
fast = head
slow = head
stack = []
în timp ce fast != None ș i [Link] != None:
[Link]([Link])
slow = [Link]
fast = [Link]
#doamnă
dacă rapid != Nimic:
slow = [Link]
returnează Adevărat
19
Listă înlănț uită palindromă
20
Ș terge elementele din lista legată
Eliminaț i toate elementele dintr-o listă legată de întregi care au valoarea val.
Exemplu dat: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6 Returnaț i: 1 --> 2 --> 3 -->
4 --> 5
URL: [Link]
21
Eliminaț i elementele din lista legată
altfel:
dummy = ListNode(0)
[Link] = head
prev = dummy
return [Link]
22
Eliminaț i duplicatele din lista înlănț uită sortată
odată.
URL: [Link]
23
Eliminaț i duplicatele din lista legată sortată
returnează capul
altfel:
lookup = {}
current = head
prev = cap
în timp ce current != None:
dacă [Link] este în lookup:
[Link] = [Link]
altfel:
lookup[[Link]] = Adevărat
prev = curent
curent = [Link]ător
returnează capul
24
Eliminaț i duplicatele din lista legată sortată II
URL:[Link]
clasă Solution(object):
def stergeDuplicatele(self, cap):
"""
:tip cap: NodLista
:rtype: ListNode
"""
dacă capul == Niciunul:
întoarce capul
altfel:
dup_dict = {}
curent = cap
în timp ce current != None:
dacă [Link] este în dup_dict:
dup_dict[[Link]] += 1
altfel:
dup_dict[[Link]] = 1
curent = [Link]ător
list_values = []
curent = cap
în timp ce curent != Niciunul:
25
Elimină duplicatele din lista legată sortată II
returnează capul
26
Schimbaț i nodurile în perechi
27
Elimină nodul N de la sfârș itul listei
Având o listă legată, elimină al n-lea nod de la sfârș itul listei ș i returnează capul listei.
De exemplu,
După ce se elimină al doilea nod de la sfârș it, lista legată devine 1->2->3->5.
Notă: n dat va fi întotdeauna valid. Încercaț i să faceț i asta într-o singură trecere.
URL:[Link]
28
Elimină nodul N de la finalul listei
rapid = [Link]ător
slow = [Link]
[Link] = [Link]
întoarce [Link]
29
Copaci
Serializarea este procesul de convertire a unei structuri de date sau a unui obiect într-un
secvenț ă de biț i astfel încât să poată fi stocată într-un fiș ier sau în memoria tampon, sau transmisă
printr-o conexiune de reț ea care urmează să fie reconstruită mai târziu în aceeaș i sau în alta
mediu informatic.
1
/ \
2 3
/ \
4 5
ca
[1,2,3,null,null,4,5]
, la fel ca
URL: [Link]
30
Copaci
clasă Codec:
def __init__(self):
self.serialized_array = []
[Link] = 0
self.serialized_array.append(None)
întoarce-te
self.serialized_array.append([Link])
[Link]([Link]ânga)
[Link]([Link])
root = TreeNode(data[[Link]])
[Link] += 1
[Link] = [Link](data)
[Link] = [Link](data)
returnează rădăcină
31
Păduri
32
Parcurgerea Preordonată
Parcurgerea preordine
Given a binary tree, return the preorder traversal of its nodes' values.
URL:[Link]
return []
altfel:
preorderList = []
stack = []
[Link](root)
în timp ce (stiva != []) :
nod = [Link]()
[Link]([Link])
dacă [Link]:
[Link]([Link])
dacă [Link]ânga:
[Link]([Link])
returnează listaPreordine
33
Parcurgere Preordonată
34
Iterator de BST
Iterator BST
Implementaț i un iterator pentru un arbore binar de căutare (BST). Iteratorul dvs. va fi
iniț ializat cu nodul rădăcină al unui BST.
Apelarea metodei next() va returna următorul cel mai mic număr din BST.
Notă: next() ș i hasNext() ar trebui să ruleze în medie în O(1) timp ș i să folosească O(h)
URL: [Link]
35
Iterator BST
clasă BSTIterator:
# @param root, un nod rădăcină al unui arbore binar de căutare
[Link](node)
nodul = [Link]ânga
36
Parcurgere Inordine
Parcurgere în ordine
Given a binary tree, return the inorder traversal of its nodes' values.
URL:[Link]
return []
altfel:
result = []
stack = []
nod = rădăcină
în timp ce stiva sau nodul:
dacă nod:
[Link](nod)
nod = [Link]ânga
altfel:
nodd = [Link]()
[Link]ă([Link])
nod = [Link]
returnează rezultatul
37
Parcurgere Inordine
38
Arbore simetric
Copac simetric
Având un arbore binar, verifică dacă este un oglindă a sa (adică, simetric în jurul său)
centru).
Notă: Puncte bonus dacă poț i rezolva atât recursiv, cât ș i iterativ.
URL:[Link]
altfel:
return [Link]([Link], [Link])
39
Copac simetric
40
Arbore binar echilibrat
Pentru această problemă, un arbore binar echilibrat pe înălț ime este definit ca un arbore binar în care
adâncimea celor două subarbori ai fiecărui nod nu diferă niciodată cu mai mult de 1.
URL: [Link]
41
Arbore Binariu Echilibrat
leftHeight = [Link]([Link])
dacă leftHeight == -1:
returnează -1
rightHeight = [Link]([Link])
dacă rightHeight == -1:
returnează -1
42
Valoarea cea mai apropiată din BST
Notă: Valoarea ț intă dată este un număr în virgulă mobilă. Eș ti garantat că ai doar unul
valoarea unică din BST care este cea mai apropiată de ț intă.
URL:[Link]
43
Cea mai apropiată valoare BST
class Solution(object):
def valoareaCeaMaiAproape(self, radacina, tinta):
"""
:tip rădăcină: TreeNode
:tip ț intă: float
:rtype: int
"""
min_dif = float("inf")
closestVal = None
întoarce None
altfel:
în timp ce rădăcina:
root_val = [Link]
val_dif = abs(root_val - target)
dacă val_dif < min_dif:
min_dif = val_dif
closestVal = root_val
dacă ț inta < valoarea rădăcină:
altfel:
root = None
return closestVal
44
Cea mai apropiată valoare din BST
45
Parcurgere postordon
Parcurgere Postorder
Având un arbore binar, returnează parcurgerea în postordine a valorilor nodurilor sale.
URL:[Link]
46
Parcurgere Postorder
return []
altfel:
stack = []
out_stack = []
[Link](root)
return out_stack[::-1]
47
Adâncimea maximă a arborelui binar
Adâncimea maximă este numărul de noduri de-a lungul celui mai lung drum din rădăcină
nod până la cel mai îndepărtat nod frunză.
URL: [Link]
"""
:tip rădăcină: NodArbore
:rtype: int
"""
dacă rădăcina == None:
întoarce 0
altfel:
return max([Link]([Link]), [Link](r
[Link])) + 1
48
Inversare arbore binar
49
Inversare a arborelui binar
:rtype: NodArbore
"""
dacă rădăcina == None:
return None
altfel:
stack = []
[Link](root)
în timp ce stiva != []:
curr_node = [Link]()
dacă curr_node.left != None sau curr_node.right !=
None:
temp = curr_node.stânga
curr_node.stanga = curr_node.dreapta
curr_node.dreapta = temp
dacă curr_node.dreapta != None:
[Link](curr_node.dreapta)
dacă curr_node.left != None:
[Link](curr_node.stanga)
returnează rădăcina
50
Acelaș i copac
Acelaș i copac
Având două copaci binari, scrieț i o funcț ie pentru a verifica dacă sunt egali sau nu.
Două arbori binari sunt consideraț i egali dacă sunt identici din punct de vedere structural ș i
nodurile au aceeaș i valoare.
URL:[Link]
altfel:
dacă p == None sau q == None:
returnează Fals
altfel:
dacă [Link] == [Link]:
return [Link]([Link], [Link]) ș i s
[Link]([Link], [Link])
altfel:
întoarce Fals
51
Cel mai mic strămoș comun al unui arbore de căutare binar
Dat fiind un arbore de căutare binar (BST), găsiț i cel mai mic strămoș comun (LCA) al două
noduri date în BST.
Conform definiț iei LCA de pe Wikipedia: „Cel mai mic strămoș comun este
definit între două noduri v ș i w ca fiind nodul cel mai jos în T care are atât v cât ș i w
ca descendenț i (unde permitem unui nod să fie un descendent al său).
_______6______
/ \
___2__ ___8__
URL:[Link]
copac
# clasa TreeNode(obiect):
# def __init__(self, x):
# [Link] = x
# [Link] = None
# [Link] = None
def __init__(self):
self.inorder_list = []
self.postorder_list = []
52
Cel mai mic strămoș comun al unui arbore binar de căutare
return None
altfel:
self.inorder_traversal(rădăcină)
auto.postorder_traversal(rădăcină)
ob ț ineț i pozi ț iile lui node1 ș i node2 în ordine
parcurgerea copacului
index_node1 = self.inorder_list.index([Link])
index_node2 = self.inorder_list.index([Link])
lca_elem = self.find_elem_max_index(between_elems)
întoarce lca_elem
53
Cel mai mic strămoș comun al unui arbore de căutare binară
self.inorder_list.append([Link])
self.inorder_traversal([Link])
54
Cel mai mic strămoș comun într-o arbore binar
Conform definiț iei LCA de pe Wikipedia: „Cel mai mic strămoș comun este
definit între două noduri v ș i w ca fiind cel mai jos nod din T care are atât v cât ș i w
ca descendenț i (unde permitem unui nod să fie un descendent al său).
_______3______
/ \
___5__ ___1__
URL:[Link]
55
Cel mai mic strămoș comun într-un arbore binar
întoarce None
stânga = [Link](rădăcină.stânga, p, q)
dreapta = [Link]([Link], p, q)
altfel:
întoarce la stânga
56
Arbori de căutare binară unici
13321\///\\321132//\\2123
URL: [Link]
57
Arbori de căutare binară unici
dacă n < 0:
returnează 0
dacă n == 0 sau n == 1:
returnează 1
possibilities = 0
58
Arbori de căutare binară unici II
De exemplu, având n = 3, programul tău ar trebui să returneze toate cele 5 BST-uri unice arătate.
mai jos.
13321\///\\321132//\\2123
URL: [Link]
59
Arbori binari de căutare unici II
l = self.tree_constructor(m, i-1)
r = self.tree_constructor(i+1, n)
pentru arbori_stânga în l:
pentru copaci_drepti în r:
curr_node = TreeNode(i)
curr_node.left = left_trees
curr_node.dreapta = arbori_dreapta
[Link](curr_node)
returna ț i rezultatele
60
Arbori binari de căutare unici II
61
Suma Cărării
Suma Căii
Dat fiind un arbore binar ș i o sumă, determină dacă arborele are o cale de la rădăcină la frunză astfel încât
adică adunarea tuturor valorilor de-a lungul căii este egală cu suma dată.
URL: [Link]
# clasa TreeNode(object):
# def __init__(self, x):
# [Link] = x
# [Link] = None
# [Link] = None
class Solution(object):
returnează Fals
altfel:
curent = rădăcină
s = []
[Link](current)
[Link]([Link])
în timp ce s != []:
pathsum = [Link]()
current = [Link]()
62
Suma Cărț ii
dacă [Link]:
rightpathsum = pathsum + [Link]
[Link]([Link])
[Link](rightpathsum)
dacă [Link]:
leftpathsum = pathsum + [Link]
[Link]([Link])
[Link](suma_cale_stanga)
returnează Fals
63
Suma maximă pe calea unui arbore binar
Pentru această problemă, un traseu este definit ca orice secvenț ă de noduri de la un anumit început
nod către orice nod în copac de-a lungul conexiunilor părinte-copil. Calea nu
nu este nevoie să treci prin rădăcină.
1
/ \
2 3
Întoarce 6
URL:[Link]
64
Suma maximă a căii din arborele binar
[Link](root)
returnează [Link]
def gasesteMax(self,radacina):
dacă rădăcina == None:
întoarce 0
stânga = [Link]([Link]ânga)
dreapta = [Link](rădă[Link])
[Link] = max([Link] + left + right, [Link])
ret = [Link] + max(left,right)
dacă ret < 0:
returnează 0
altfel:
returna ț i ret
65
Parcurgerea unui Arbore Binara în Ordine pe Niveluri
Dat fiind un arbore binar, returnaț i parcurgerea pe niveluri a valorilor nodurilor sale. (adică, de la
de la stânga la dreapta, nivel cu nivel.
URL:[Link]
66
Parcurgerea unui arbore binar în ordinea nivelurilor
# clasa TreeNode:
# def __init__(self, x):
# [Link] = x
# [Link] = None
# [Link] = None
import Coada
clasa Solu ț ie:
# @param {TreeNode} radacina
# @return {integer[][]}
def parcurgereNivel(self, radacina):
dacă rădăcina == None:
return []
altfel:
q = [Link]()
[Link](root)
[Link]("#")
levelOrderTraversal = []
level = []
în timp ce [Link]() == Fals:
nod = [Link]()
dacă nodul == "#":
dacă [Link]() == Fals:
[Link]("#")
[Link](nivel)
level = []
altfel:
[Link]([Link])
dacă [Link]ânga:
[Link]([Link])
dacă [Link]:
[Link]([Link])
67
Validare arbore de căutare binar
Subarborele stâng al unui nod conț ine doar noduri cu chei mai mici decât cheia nodului.
Subarborele drept al unui nod conț ine doar noduri cu chei mai mari decât cheia nodului.
cheie. Atât subarborii stângi cât ș i cei drepț i trebuie să fie, de asemenea, arbori de căutare binară. Exemplul 1:
URL:[Link]
68
Validaț i un arbore de căutare binar
data = [Link]
dacă datele <= [Link]:
returnează Fals
[Link] = date
returna ț i True
69
Adâncimea minimă a unui arbore binar
Adâncimea minimă este numărul de noduri de-a lungul celui mai scurt drum de la rădăcină
nod până la cel mai apropiat nod frunză.
URL:[Link]
70
Adâncimea minimă a unui arbore binar
import sys
# Defini ț ie pentru un nod de arbore binar.
# clasa TreeNode(obiect):
# def __init__(self, x):
# [Link] = x
# [Link] = None
# [Link] = None
"""
:tip rădăcină: NodArbore
:rtype: int
"""
dacă rădăcina == Nimic:
return 0
altfel:
left = [Link]
71
Transformaț i un array sortat într-un arbore de căutare binar
URL: [Link]
72
Conversie a unui tablou sortat într-un arbore binar de căutare
73
Transformaț i arborele binar într-o listă legată
Dat fiind un arbore binar, aplatizează-l într-o listă legată la locul său.
De exemplu, dat
1
/ \
2 5
/ \ \
3 4 6
URL:[Link]
74
Aplatizarea unui arbore binar într-o listă legată
# clasa TreeNode(object):
# def __init__(self, x):
# [Link] = x
# [Link] = None
# [Link] = None
"""
:tip rădăcină: NodArbore
:rtype: void Nu returna ț i nimic, modifica ț i rădăcina în loc
e în schimb.
"""
dacă rădăcina == None:
întoarce rădăcina
stack = []
current = root
curent = [Link]
75
Construieș te un arbore binar din traversarea in ordine ș i preordine
URL:[Link]
traversarea-in-ordine/
76
Construieș te un arbore binar din parcurgerea în ordine ș i parcurgerea preordine
root = TreeNode(preorder[low_preorder])
div_index = self.search_divindex(inorder, low_inorder, h
igh_inorder, [Link]
size_left_subtree = div_index - low_inorder
size_right_subtree = high_inorder - div_index
întoarce rădăcina
77
Cărț i ale unui arbore binar
["1->2->5","1->3"]
URL: [Link]
# clasa NodArbore:
# def __init__(self, x):
# [Link] = x
# [Link] = None
# [Link] = None
return []
altfel:
paths = []
current = root
s = []
[Link](curent)
[Link](str([Link]))
în timp ce s != []:
#pathsum = [Link]()
calea = [Link]()
current = [Link]()
[Link](path)
78
Cărț ile binare ale copacului
dacă [Link]:
rightstr = calea + "->" + str([Link].v
al)
[Link]([Link])
[Link](rightstr)
dacă [Link]:
leftstr = cale + "->" + str([Link]
)
[Link]([Link]ânga)
[Link](leftstr)
returna ț i căile
79
Recuperaț i Arborele Binare de Căutare
Două elemente ale unui arbore de căutare binar (BST) au fost schimbate din greș eală.
Notă: O soluț ie care foloseș te O(n) spaț iu este destul de simplă. Ai putea concepe o
soluț ie cu spaț iu constant?
URL: [Link]
80
Recuperaț i arborele de căutare binar
# clasa TreeNode(object):
# def __init__(self, x):
# [Link] = x
# [Link] = None
# [Link] = None
"""
tip rădăcină: NodArbore
:rtype: void Nu returna ț i nimic, modifica ț i rădăcina în loc
în loc.
"""
[Link](rădăcină)
temp = self.__node1.val
self.__node1.val = self.__node2.val
self.__node2.val = temp
return None
[Link]([Link]ânga)
dacă self.__prev != None:
dacă self.__prev.val > [Link]:
dacă self.__node1 == Niciunul:
self.__nod1 = self.__prev
self.__node2 = root
self.__prev = root
[Link]([Link])
81
Suma Cărării II
Calea suma II
Dat un arbore binar ș i o sumă, găsiț i toate căile din rădăcină până la frunză pentru care suma fiecărei căi
For example: Given the below binary tree and sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \
[ [5,4,11,2], [5,8,4,5] ]
URL:[Link]
# clasa TreeNode(obiect):
# def __init__(self, x):
# [Link] = x
# [Link] = None
# [Link] = None
return []
altfel:
stack = []
paths = []
curent = rădăcină
[Link](current)
[Link]([[Link]])
[Link]([Link])
while stack != []:
pathsum = [Link]()
cale = [Link]()
curr = [Link]()
82
Suma Cărării II
83
Traversare pe niveluri binare II
URL:[Link]
importa Coada
clasa Solu ț ie:
# @param {TreeNode} root
# @return {integer[][]}
def nivelOrdineJos(self, radacina):
dacă rădăcina == Niciunul:
return []
altfel:
q = [Link]()
[Link](root)
[Link]("#")
levelOrderTraversal = []
level = []
stack = []
nod = [Link]()
dacă nodul == "#":
dacă [Link]() == Fals:
[Link]("#")
[Link](nivel)
84
Parcurgerea nivelurilor binare II
level = []
altfel:
[Link]([Link])
dacă [Link]ânga:
[Link]([Link]âng)
dacă [Link]:
[Link]([Link])
85
Cel de-al K-lea cel mai mic element într-un BST
Given a binary search tree, write a function kthSmallest to find the kth smallest
element în el.
Notă: Poț i presupune că k este întotdeauna valid, 1 ≤ k ≤ numărul total de elemente ale BST.
Urmaț i: Ce se întâmplă dacă BST-ul este modificat (operaț iuni de inserare/ș tergere) frecvent ș i dvs.
Trebuie să găseș ti frecvent al k-lea cel mai mic? Cum ai optimiza al k-lea cel mai mic?
rutina?
Indiciu:
Încercaț i să utilizaț i proprietatea unui BST. Ce s-ar întâmpla dacă aț i putea modifica nodul BST-ului?
URL:[Link]
86
Cel de-al K-lea cel mai mic element dintr-un BST
return None
altfel:
stack = []
nod = rădăcină
count = 0
în timp ce stiva != [] sau nod != None:
dacă nod != Niciunul:
[Link](node)
nod = [Link]ânga
altfel:
inorder_node = [Link]()
count += 1
daca count == k:
return inorder_node.val
nod = inorder_node.dreapta
return None
87
Al k-lea cel mai mic element dintr-un BST
în timp ce rădăcină:
[Link](root)
radacina = [Link]
root = [Link]()
dacă k == 1:
return [Link]
altfel:
k -= 1
root = [Link]
88
Construiț i un arbore binar din traversarea înordine ș i postordine
Dat fiind parcurgerea în ordine ș i parcurgerea în postordine a unui arbore, construieș te arborele binar.
întoarce -1
89
Construiț i un arbore binar din parcurgerea în ordine ș i parcurgerea postordine
root = TreeNode(postorder[high_postorder])
returnează rădăcina
90
Vedere din partea dreaptă a arborelui binar
URL: [Link]
91
Vederea din dreapta a arborelui binar
importa coada
clasa Solu ț ie:
# @param {TreeNode} rădăcină
# @return {integer[]}
def vedereParteaDreapta(self, radacina):
dacă rădăcina == None:
return []
altfel:
q = [Link]()
[Link](root)
[Link]("#")
rightSideView = []
level = []
în timp ce [Link]() == Fals:
nod = [Link]()
dacă nodul == "#":
dacă [Link]() == Fals:
[Link]("#")
[Link](level[-1])
level = []
altfel:
[Link]([Link])
dacă [Link]ânga != None:
[Link]([Link])
dacă [Link] != None:
[Link]([Link])
returna ț i viziunea din partea dreaptă
92
Sumă Rădăcină la Numerele Frunze
Având un arbore binar care conț ine cifre de la 0 la 9 numai, fiecare cale de la rădăcină la frunză ar putea
reprezintă un număr.
De exemplu,
/ \ 2 3 Calea de la rădăcină la frunză 1->2 reprezintă numărul 12. Calea de la rădăcină la frunză
1->3 reprezintă cifra 13.
93
Suma numerelor de la rădăcină la frunze
94
Parcurgerea în ordinea zigzag a nivelurilor unui arbore binar
Dat fiind un arbore binar, returnaț i traversarea în ordine zigzag a valorilor nodurilor sale. (adică,
de la stânga la dreapta, apoi de la dreapta la stânga pentru nivelul următor ș i alternează între ele.
importa Coada
clasa Solu ț ie:
# @param {TreeNode} rădăcină
# @return {integer[][]}
def zigzagLevelOrder(self, radacina):
dacă rădăcina == None:
return []
altfel:
q = [Link]()
[Link](root)
[Link]("#")
levelOrderTraversal = []
level = []
levelNo = 0
în timp ce q.este_gol() == Fals:
nod = [Link]()
if levelNo == 0 or levelNo % 2 == 0:
[Link](level)
95
Traversarea pe niveluri Zigal a Arborelui Binari
altfel:
[Link](level[::-1])
level = []
nivelNo += 1
altfel:
[Link]([Link])
dacă [Link]ânga:
[Link]([Link])
dacă [Link]:
[Link]([Link])
return nivelOrdineTraversare
96
Jaf de Case III
Hoț ul ș i-a găsit din nou un nou loc pentru jafurile sale. Există doar unul
intrarea în această zonă, numită „rădăcină.” Pe lângă rădăcină, fiecare casă are una ș i
doar o casă cu un singur părinte. După un tur, hoț ul inteligent a realizat că "toate casele din această
locul formează un arbore binar". Va contacta automat poliț ia dacă două direct
casele interconectate au fost sparte în aceeaș i noapte.
Stabileș te suma maximă de bani pe care hoț ul o poate fura în această noapte fără
alertarea poliț iei.
URL: [Link]
97
Furtiș ag III
# clasa TreeNode(obiect):
# def __init__(self, x):
# [Link] = x
# [Link] = None
# [Link] = None
altfel:
result = self.rob_max(root)
returnează max(result[0], result[1])
return [0, 0]
altfel:
left_res = self.rob_max([Link])
right_res = self.rob_max([Link])
result = [0]*2
result[0] = [Link] + left_res[1] + right_res[1]
result[1] = max(left_res[0], left_res[1]) + max(righ
t_res[0], right_res[1])
întoarce rezultatul
98
Succesorul Inorder în BST
Notă: Dacă nodul dat nu are succesor în ordine în arbore, returnaț i null.
URL:[Link]
99
Succesorul în ordine în BST
# clasa NodArbore(object):
# def __init__(self, x):
# [Link] = x
# [Link] = None
# [Link] = None
return None
rădăcină = rădăcină.dreapta
100
Secvenț a consecutivă cea mai lungă a copacului binar
altfel:
max_size = 1
size_q = Queue()
node_q = Queue()
node_q.put(root)
101
Secvenț ă consecutivă cea mai lungă în arbore binar
size_q.put(1)
în timp ce node_q.empty() == Fals:
curr_node = node_q.get()
curr_size = size_q.get()
dacă curr_node.stânga:
left_size = curr_size
dacă curr_node.val == curr_node.[Link] - 1:
left_size += 1
max_size = max(max_size, left_size)
altfel:
left_size = 1
node_q.put(curr_node.stanga)
size_q.put(left_size)
dacă curr_node.dreapta:
right_size = curr_size
dacă curr_node.val == curr_node.[Link] - 1:
right_size += 1
max_size = max(max_size, right_size)
altfel:
right_size = 1
node_q.put(curr_node.dreapta)
size_q.put(talia_dreaptă)
returna ț i max_size
102
Verificarea secvenț ei preordine în arborele binar de căutare
URL:[Link]
copac
importa sistem
clasa Solu ț ie(object):
def verificaPreordine(self, preordine):
"""
:tip preordine: List[int]
:rtype: bool
"""
stack = []
root = -[Link]-1
returnează Fals
[Link](entries)
întoarce Adevărat
103
Verificarea secvenț ei de preordonare în arborele binar de căutare
104
Arbore binar cu susul în jos
Având un arbore binar în care toate nodurile din dreapta sunt fie noduri frunză cu un frate (o
nodule stâng care Împarte acelaș i nod părinte) sau gol, întoarce-l cu susul în jos ș i întoarce-l
într-un copac în care nodurile originale din dreapta s-au transformat în noduri frunză din stânga. Returnează
rădăcină nouă.
parent = None
parent_right = None
în timp ce p:
left = [Link]
[Link] = dreapta_parintelui
parent_right = [Link]
[Link] = părinte
parent = p
p = stânga
returnează părintele
105
Arbore Binar Cu Susul în Jos
106
Numără Subarborii cu Valori Unice
URL:[Link]
107
Numără subarborii univalenț i
"""
:tip rădăcină: NodArbore
:rtype: int
"""
self.count_univalue_subtrees(root)
return self.__count
stângă = self.count_univalue_subtrees([Link])
dreapta = self.count_univalue_subtrees([Link])
altfel:
returnează False
108
Numărul de componente conectate într-un graf neorientat
URL: [Link]
grafic-neorientat/
importă sistem
din coadă import Coadă
clasă Vârf:
def __init__(self, nod):
[Link] = nod
[Link] = {}
Seta ț i distan ț a la infinit pentru toate nodurile
[Link] = [Link]
Marca ț i toate nodurile ca nevizitate
[Link] = False
Marchează toate nodurile cu culoarea albă
[Link] = 'white'
Precursor
[Link] = None
def ob ț ineConexiuni(self):
return [Link]()
def getVertexID(self):
return [Link]
109
Numărul de componente conectate într-un graf neorientat
def obtineDistanta(self):
returnează [Link]
def getCuloare(self):
returnează [Link]
def setVizitat(self):
[Link] = True
def __str__(self):
return str([Link]) + ' adiacente: ' + str([[Link] pentru x în
[Link]])
clasa Graf:
def __init__(self):
[Link] = {}
[Link] = 0
def __iter__(self):
return iter([Link]())
110
Numărul de componente conectate într-un graf neorientat
altfel:
întoarce Niciunul
[Link][frm].addNeighbor([Link]
[to], cost)
[Link][to].addNeighbor([Link][
frm], cost)
def obtineVarfuri(self):
return [Link]()
altfel:
G = Grafic()
pentru intrări în margini:
[Link](entrări[0], intrări[1], 1)
count = 0
pentru vârtex în G:
dacă [Link]() == "alb":
count += 1
111
Numărul de componente conectate într-un graf neorientat
[Link](vârf)
returnare număr
n = 5
edges1 = [[0, 1], [1, 2], [3, 4]]
edges2 = [[0, 1], [1, 2], [2, 3], [3, 4]]
112
Programul cursului
Course Schedule
Există un număr total de n cursuri pe care trebuie să le urmezi, etichetate de la 0 la n - 1.
Unele cursuri pot avea cerinț e prealabile, de exemplu, pentru a urma cursul 0 trebuie să
începe mai întâi cursul 1, care este exprimat ca o pereche: [0,1]
Având în vedere numărul total de cursuri ș i o listă de perechi de cerinț e preliminare, este posibil pentru
tu să finalizezi toate cursurile?
For example:
Notă: Cerinț ele preliminare de intrare sunt un graf reprezentat printr-o listă de muchii, nu
matrice de adiacenț ă. Citeș te mai multe despre cum este reprezentat un graf.
URL: [Link]
clasa Vertex:
113
Programul cursului
def obtine_vecini(self):
return [Link]()
def obtine_id(self):
return [Link]
def get_indegree(self):
return [Link]
def obtine_grad_extern(self):
return [Link]
[Link] = outdegree
def get_predecessor(self):
returnează autoarea
def obtine_timp_de_visitare(self):
returnează self.visit_time
self.visit_time = visit_time
def obtine_timp_final(self):
returnează timpul_final
def obtine_culoare(self):
114
Programul cursului
returnează [Link]
def __str__(self):
return str([Link]) + ' conectat la: ' + str([[Link] pentru x
în [Link]])
clasa Grafic:
def __init__(self):
self.vertex_dict = {}
self.no_vertices = 0
self.no_edges = 0
dacă nu în self.vertex_dict:
self.adauga_varf(to)
to_vertex = self.get_vertex(to)
115
Programul cursului
altfel:
to_vertex = self.vertex_dict[to]
from_vertex.adauga_vecin(to_vertex, greutate)
from_vertex.set_outdegree(from_vertex.get_outdegree() +
1)
to_vertex.set_indegree(to_vertex.get_indegree() + 1)
self.no_edges += 1
def obtine_margini(self):
edges = []
pentru u în self.vertex_dict:
pentru v în self.vertex_dict[u].get_neighbors():
u_id = u
#print(v)
v_id = v.get_id()
[Link]((u_id, v_id, self.vertex_dict[u].ge
t_weight(v)))
returna ț i muchiile
def obtine_varfurile(self):
return self.vertex_dict
clasa DFS:
def dfs(self):
pentru vârf în [Link].get_vertices():
dacă [Link].vertex_dict[vertex].get_color() == "alb"
ite
self.dfs_visit([Link].vertex_dict[vertex])
116
Programul cursului
self.has_cycle = True
dacă vert.get_color() == "alb":
vert.set_color("gri")
self.dfs_visit(vert)
node.set_color("negru")
întoarce Adevărat
altfel:
g = Graf()
dfs_obj = DFS(g)
dfs_obj.dfs()
dacă dfs_obj.are_cicluri == Adevărat:
returnează Fals
altfel:
returnează Adevărat
117
Graf arbore valid
De exemplu:
Dat n = 5 ș i muchiile = [[0, 1], [0, 2], [0, 3], [1, 4]], returnează adevărat.
Given n = 5 and edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]], return false.
Indicaț ie:
Având n = 5 ș i muchii = [[0, 1], [1, 2], [3, 4]], ce ar trebui să returnezi? Este această situaț ie
o arbore valid? Conform definiț iei de arbore de pe Wikipedia: "un arbore este un"
grafic neorientat în care orice două vârfuri sunt conectate printr-un singur drum.
în alte cuvinte, orice graf conectat fără cicluri simple este un arbore.
URL:[Link]
import sys
clasă Vârf:
def __init__(self, nod):
[Link] = node
[Link] = {}
Seta ț i distan ț a la infinit pentru toate nodurile
[Link] = [Link]
Marchează toate nodurile ca nevizitate
[Link] = False
Marchează toate nodurile cu culoarea albă
[Link] = 'white'
Predecesor
[Link] = None
def ob ț ineConexiuni(self):
118
Grafic Copac Valabil
return [Link]()
def obtineIDVertex(self):
return [Link]
def getColor(self):
returnează [Link]
def setVisited(self):
[Link] = True
def __str__(self):
return str([Link]) + ' adiacent: ' + str([[Link] pentru x în
[Link]])
clasă Grafică:
def __init__(self):
[Link] = {}
[Link] = 0
def __iter__(self):
return iter([Link]())
119
Graf copac valid
newVertex = Vertex(nod)
[Link][node] = newVertex
returnează newVertex
[Link][frm].adaugaVecin([Link]
[to], cost)
[Link][to].addNeighbor([Link][
frm], cost)
def obtineVarfuri(self):
return [Link]()
120
Graf valid arbore
returnează Fals
elif n == 0 ș i len(edges) > 0:
returnează Fals
elif n == 1 ș i len(edges) >= 1:
returnează Fals
altfel:
G = Grafic()
pentru intrări în margini:
[Link](entries[0], entries[1], 1)
results = []
pentru vârful în G:
dacă [Link]() == "alb":
[Link](self.check_validity(vertex))
121
Graf valid de arbore
122
Programul cursului 2
Programul cursului 2
Există un total de n cursuri pe care trebuie să le urmezi, etichetate de la 0 la n - 1.
Unele cursuri pot avea cerinț e prealabile, de exemplu pentru a urma cursul 0 trebuie să
mai întâi urmează cursul 1, care este exprimat ca o pereche: [0,1]
Este posibil să existe mai multe ordine corecte, trebuie doar să returnaț i unul dintre ele. Dacă este
imposibil de finalizat toate cursurile, returnaț i un array gol.
De exemplu:
URL:[Link]
clasa Vertex:
def __init__(self, nod):
[Link] = nod
[Link] = {}
Setează distan ț a la infinit pentru toate nodurile
[Link] = [Link]
# Marchează toate nodurile ca nevizitate
[Link] = False
# Marcare toate nodurile cu alb
[Link] = 'white'
Predecesor
123
Programul cursului 2
[Link] = None
gradul de intrare al vârfului
[Link] = 0
def obtineConexiuni(self):
return [Link]()
def obtineIDVertice(self):
return [Link]
def getDistance(self):
returnează distan ț a
def obtineCuloarea(self):
return [Link]
def setVisited(self):
[Link] = True
def obtineGradIntrare(self):
returnează [Link]
124
Programul cursului 2
def __str__(self):
return str([Link]) + ' adiacente: ' + str([[Link] for x in
[Link]])
def __iter__(self):
return iter([Link]())
[Link][frm].adaugaVecin([Link]
[către], cost)
[Link][to].setIndegree([Link][
to].getIndegree() + 1)
def obtineVarfuri(self):
return [Link]()
125
Programul cursului 2
return []
altfel:
G = GrafDirec ț ionat()
pentru intrările în cerin ț ele preliminare:
[Link]ăMuchie(entrări[1], entrări[0], 1)
return [Link](G)
126
Programul cursului 2
întoarce_listă_topologică
127
Numărul de insule
Numărul de insule
Dând o hartă 2D dintr-o reț ea de '1' (teren) ș i '0' (apă), numără numărul de insule. Un
insula este înconjurată de apă ș i este formată prin conectarea terenurilor adiacente
orizontal sau vertical. Puteț i presupune că toate cele patru margini ale reț elei sunt toate
înconjurat de apă.
Exemplul 1:
Exemplul 2:
URL:[Link]
128
Numărul de insule
return 0
row = len(grid)
col = len(grid[0])
folosit = [[Fals pentru j în xrange(col)] pentru i în xrange(row)]
)]
count = 0
pentru i în xrange(row):
pentru j în xrange(col):
dacă grid[i][j] == '1' ș i nu a fost folosit[i][j]:
dacă x != 0:
[Link](grid, folosit, rand, col, x - 1, y)
dacă x != rând - 1:
[Link](grid, folosit, linie, col, x + 1, y)
dacă y != 0:
[Link](grid, folosit, rand, col, x, y - 1)
dacă y != col - 1:
[Link](grid, folosit, rând, col, x, y + 1)
129
Îmbinaț i K liste legate sortate
URL:[Link]
130
Mergi K liste legate sortate
import heapq
Defini ț ie pentru lista legată simplă.
clasa ListNode(obiect):
def __init__(self, x):
[Link] = x
[Link] = None
altfel:
pq = []
pentru i în intervalul(len(lists)):
dacă listele[i] != Niciuna:
dummy = ListNode(0)
p = dummy
return [Link]
131
Cel de-al K-lea element cel mai mare dintr-un array
Găseș te al k-lea cel mai mare element dintr-un array nesortat. Observaț i că este al k-lea cel mai mare
URL:[Link]
return [Link](heap)[0]
132
2 Suma II
2 Suma II
Dat fiind un tablou de numere întregi care este deja sortat în ordine crescătoare, găseș te două
Funcț ia twoSum ar trebui să returneze indicii celor două numere astfel încât să se adune
până la ț intă, unde index1 trebuie să fie mai mic decât index2. Vă rugăm să reț ineț i că dumneavoastră
URL:[Link]
return [-1]
133
2 Suma II
134
2 Suma III
2 Suma III
Proiectaț i ș i implementaț i o clasă TwoSum. Aceasta ar trebui să suporte următoarele
add - Add the number to an internal data structure. find - Find if there exists any
o pereche de numere a căror sumă este egală cu valoarea.
De exemplu, add(1); add(3); add(5); find(4) -> adevărat find(7) -> fals
URL:[Link]
importa colec ț ii
clasa TwoSum(object):
def __init__(self):
"""
initializa ț i structura de date aici
"""
self.__num_list = [Link](int)
135
2 Suma III
dacă len(self.__num_list) == 0:
returnează Fals
în altă ordine de idei:
pentru intrările din self.__num_list.keys():
ț intă = valoare - intrări
dacă ( ț inta este în self.__num_list) ș i (înregistrările != t
întoarce Fals
136
Conț ine Duplicate
URL:[Link]
altfel:
dup_dict[entries] = 1
întoarce Fals
137
Roteș te Array
Notă: Încearcă să găseș ti cât mai multe soluț ii posibile, există cel puț in 3 diferite.
moduri de a rezolva această problemă.
URL: [Link]
138
Rotunjeș te tabloul
while i < j:
nums[i], nums[j] = nums[j], nums[i]
i += 1
j -= 1
soln = Solution()
nums = [1,2,3,4,5,6,7]
[Link] ț ie(nums, 3)
printaț i(nums)
139
3 Suma mai mică
Întoarce 2. Pentru că există două tripluri al căror sumă este mai mică decât 2:
[-2, 0, 1] [-2, 0, 3]
URL:[Link]
140
3 Suma mai mică
print(triplet_lista)
#return len([list(entries) for entries in set(triple
t_list)])
return len(triplet_list)
141
3 Suma Cea Mai Aproape
Dat fiind un array S de n întregi, găsiț i trei întregi în S astfel încât suma să fie cea mai apropiată.
la un număr dat, ț intă. Returnaț i suma celor trei întregi. Puteț i presupune
că fiecare input ar avea exact o soluț ie.
Suma care este cea mai apropiată de ț intă este 2. (-1 + 2 + 1 = 2).
URL:[Link]
142
3 Suma cea mai apropiată
importa ț i sys
clasa Solu ț ie(object):
def treiSumeCelMaiAproape(self, numere, ț intă):
"""
:tip nums: List[int]
:tip ț intă: int
:rtype: int
"""
dacă len(nums) este în [0,1,2]:
return 0
altfel:
min_diff = [Link]
result = 0
sorted_nums = sortate(nums)
pentru i în intervalul(len(nums)):
start = i + 1
end = len(nums) - 1
în timp ce start < end:
curr_sum = sorted_nums[i] + sorted_nums[star
t] + sorted_nums[end]
diff = abs(curr_sum - target)
dacă diff == 0:
return curr_sum
dacă diff < min_diff:
min_diff = diff
result = curr_sum
dacă curr_sum <= ț intă:
start += 1
altfel:
sfâr ș it -= 1
întoarce rezultatul
soln = Solution()
print([Link]([-1, 2, 1, -4], 1))
print([Link]([-1, 2, 1, -4], 3))
143
3 Suma Celor Mai Aproape
144
3 Suma
3 Suma
D given un aranjament S de n întregi, există elemente a, b, c în S astfel încât a + b + c
= 0? Găsiț i toate tripletele unice din array care dau suma zero.
URL:[Link]
145
3 Sum
if __name__ == "__main__":
soln = Solu ț ie()
print([Link]([-1, 0, 1, 2, -1, -4]))
146
Două Sume
Două Sume
Dat fiind un array de întregi, returnează indicii celor două numere astfel încât să se adune
până la un obiectiv specific.
URL:[Link]
x = nums[i]
dacă target-x în dic ț ionar:
return (dict[target-x], i)
dict[x] = i
147
Plus Unu
Plus Unu
Dat fiind un număr nenegativ reprezentat ca un ș ir de cifre, plus unu la
număr.
Cifrele sunt stocate astfel încât cifra cea mai semnificativă să fie la începutul listei.
URL:[Link]
carry = 1
altfel:
carry = 0
new_digits.append(running_sum % 10)
i -= 1
dacă transportul == 1:
new_digits.append(1)
return new_digits[::-1]
altfel:
returna ț i new_digits[::-1]
148
Plus Unu
149
Cel mai bun moment pentru a cumpăra ș i a vinde acț iuni
Să zicem că ai un array pentru care elementul i este preț ul unei acț iuni date pe
ziua i.
Dacă ț i-ar fi permis să efectuezi cel mult o tranzacț ie (adică, să cumperi una ș i
vinde o acț iune a acț iunii), proiectează un algoritm pentru a găsi profitul maxim.
diferenț a maximă = 6-1 = 5 (nu 7-1 = 6, deoarece preț ul de vânzare trebuie să fie mai mare decât
preț ul de cumpărare) Exemplu 2: Intrare: [7, 6, 4, 3, 1] Ieș ire: 0
altfel:
max_profit = 0
min_price = prices[0]
pentru i în intervalul(len(pre ț uri)):
returnează max_profit
150
Distanț a cea mai scurtă între cuvinte
Având o listă de cuvinte ș i două cuvinte word1 ș i word2, returnează cea mai scurtă distanț ă
între aceste două cuvinte din listă.
Notă: Poț i presupune că cuvântul1 nu este egal cu cuvântul2, iar cuvântul1 ș i cuvântul2
sunt amândouă în listă.
URL:[Link]
151
Distanț a cea mai scurtă între cuvinte
import sys
clasă Solu ț ie(object):
def distantaCeaMaiScurta(self, cuvinte, cuvant1, cuvant2):
"""
:tip cuvinte: List[str]
:tip cuvânt1: str
:tip cuvânt2: str
:rtype: int
"""
word2_positions = []
word1_positions = []
pentru i în intervalul(len(cuvinte)):
word1_positions.append(i)
dacă word2 == words[i]:
word2_positions.adauga(i)
min_dist = [Link]
return min_dist
152
Mută Zerourile
Mută zerourile
Având un array nums, scrie o funcț ie pentru a muta toate 0-urile la sfârș itul acestuia în timp ce
De exemplu, având nums = [0, 1, 0, 3, 12], după ce ai apelat funcț ia ta, nums ar trebui să
fii [1, 3, 12, 0, 0].
Notă: Trebuie să faceț i asta în loc, fără a face o copie a array-ului. Minimizaț i
numărul total de operaț iuni.
URL:[Link]
i = 0
j = 0
while j < len(nums):
dacă nums[j] == 0:
j += 1
altfel:
nums[i] = nums[j]
i += 1
j += 1
153
Conț ine Duplicatul II
URL:[Link]
returnează Fals
elif len(nums) == 1:
returnează Fals
elif len(nums) == 2:
dacă nums[0] != nums[1]:
returnează Fals
altfel:
dacă nums[0] == nums[1] ș i k >= 1:
returnează adevărat
altfel:
întoarce False
altfel:
index_dict = {}
pentru i în intervalul(len(nums)):
index_dict[nums[i]] = i
returnează Fals
154
Conț ine Duplicate II
155
Element majoritar
Elementul majoritar
Dată fiind o matrice de dimensiune n, găsiț i elementul majoritar. Elementul majoritar este
elementul care apare de mai mult de ⌊n/2⌋ ori.
URL:[Link]
156
Element Majoritar
returnează candidatul
altfel:
return None
157
Element majoritar
158
Elimină duplicatele dintr-un array sortat
Nu alocaț i spaț iu suplimentar pentru un alt tablou, trebuie să faceț i asta în loc.
memorie constantă.
Funcț ia ta ar trebui să returneze lungimea = 2, cu primii doi elemente din nums fiind 1
ș i 2, respectiv. Nu contează ce laș i dincolo de noua lungime.
URL:[Link]
159
Suma Greutăț ii Listei Imbricate
Având o listă imbricată de întregi, returnaț i suma tuturor întregilor din listă cântărită de
adâncimea lor.
Fiecare element este fie un întreg, fie o listă - al cărei elemente pot fi de asemenea întregi
sau alte liste.
Exemplul 2: Dat fiind lista [1,[4,[6]]], returnează 27. (un 1 la adâncimea 1, un 4 la adâncimea 2,
ș i un 6 la adâncimea 3; 1 + 42 + 63 = 27)
URL:[Link]
# """
Aceasta este interfa ț a care permite crearea listelor imbricate.
Nu ar trebui să-l implementezi sau să speculezi despre implementarea sa.
ţion
# """
#clasă NestedInteger(object):
# def esteIntreg(self):
# """
# _returna ț i adevărat dacă acest NestedInteger con ț ine un singur întreg_
er, mai degrabă decât o listă imbricată.
# :rtype bool
# """
#
# def obtineIntegerself):
# """
# returna ț i singurul întreg pe care acest NestedInteger îl de ț ine
s, dacă con ț ine un singur întreg
# Return None if this NestedInteger holds a nested list
# :tip int
# """
#
# def getList(self):
160
Suma Greutăț ii Listei Imbicate
# """
# returnează lista imbricată pe care o de ț ine acest NestedInteger,
dacă con ț ine o listă imbricată
# Returna ț i None dacă acest NestedInteger con ț ine un singur întreg
r
# :rtype List[NestedInteger]
# """
altfel:
sum = 0
pentru intrări în lista_nesfâr ș ită:
dacă intră[Link]():
sum += [Link]()*adâncime
altfel:
sum += self.depthSum_helper([Link](
), adâncime + 1)
returnează suma
161
Suma ponderată a listei imbricate II
Dată fiind o listă imersată de întregi, returnează suma tuturor întregilor din listă, ponderată de
adâncimea lor.
Fiecare element este fie un întreg, fie o listă - ale cărei elemente pot fi de asemenea întregi
sau alte liste.
Exemplu 2: Dată fiind lista [1,[4,[6]]], returnaț i 17. (un 1 la adâncimea 3, un 4 la adâncimea 2,
ș i un 6 la adâncimea 1; 13 + 42 + 6*1 = 17)
URL:[Link]
162
Elimină elementul
Elimină elementul
Dat un tablou ș i o valoare, eliminaț i toate instanț ele acestei valori în loc ș i returnaț i
noua lungime.
Nu alocaț i spaț iu suplimentar pentru un alt array, trebuie să faceț i asta în loc.
memorie constantă.
Funcț ia ta ar trebui să returneze lungimea = 2, cu primele două elemente din nums fiind 2.
URL:[Link]
return len(nums[0:i])
163
Eliminare element
164
Intersecț ia a Două Mici II
Exemplu: Având nums1 = [1, 2, 2, 1], nums2 = [2, 2], returnaț i [2, 2].
Note: Each element in the result should appear as many times as it shows in both
arregi. Rezultatul poate fi în orice ordine. Continuare: Ce se întâmplă dacă array-ul dat este
deja sortat? Cum ai optimiza algoritmul tău? Ce dacă dimensiunea lui nums1 este
mic comparativ cu dimensiunea lui nums2? Care algoritm este mai bun? Ce dacă elementele de
nums2 sunt stocate pe disc, iar memoria este limitată astfel încât nu poț i încărca tot
elemente în memorie deodată?
165
Intersecț ia a două array-uri II
i = 0
j = 0
intersect_list = []
return intersect_list
166
Fuzionarea unor array-uri sortate
Notă: Puteț i presupune că nums1 are suficient spaț iu (dimensiunea este mai mare sau
egal cu m + n) pentru a reț ine elemente suplimentare din nums2. Numărul de elemente
iniț ializat în nums1 ș i nums2 sunt m ș i n respectiv.
URL:[Link]
167
Îmbinaț i array-urile sortate
168
Inversarea vocalelor dintr-un ș ir
URL:[Link]
169
Inversează vocalele unui ș ir
altfel:
i=0
j = len(s) - 1
s = list(s)
în timp ce i < j:
dacă s[i] nu este în auto.__vocale:
i += 1
continuă
dacă s[j] nu este în auto.__vocale:
j -= 1
continuare
s[i], s[j] = s[j], s[i]
i += 1
j -= 1
return "".join(s)
170
Intersecț ia a două array-uri
Exemplu: Dat nums1 = [1, 2, 2, 1], nums2 = [2, 2], returnaț i [2].
Note: Each element in the result must be unique. The result can be in any order.
URL: [Link]
return [Link]()
171
Containerul cu cea mai multă apă
Dând numere întregi nenegative a1, a2, ..., an, unde fiecare reprezintă un punct la
coordonate (i,ai). Se trag n linii verticale astfel încât cele două capete ale liniei i să fie la
(i,ai) ș i (i, 0). Găsiț i două linii, care împreună cu axa x formează un container, astfel încât
că recipientul conț ine cea mai multă apă.
URL:[Link]
i += 1
alteci:
j -= 1
returnează aria_maximă
172
Produsul array-ului cu excepț ia sine
Urmărire:
Ai putea să o rezolvi cu complexitate spaț ială constantă? (Notă: Array-ul de ieș ire
nu contează ca spaț iu suplimentar în scopul analizei complexităț ii spaț iale.)
URL:[Link]
before[i] = before[i-1]*nums[i-1]
product[i] = before[i]*after[i]
returnează produsul
173
Capturarea apei de ploaie
Date fiind n numere întregi non-negative care reprezintă o hartă de elevare unde lăț imea de
fiecare bară este 1, calculează câtă apă este capabilă să reț ină după ploaie.
De exemplu,
Dat[0,1,0,2,1,0,1,3,2,1,2,1] , return6.
URL:[Link]
174
Capturarea apei de ploaie
175
Subarray Maxim
Găseș te subarray-ul contigu contând cel puț in un număr în cadrul unui array
care are suma cea mai mare.
URL: [Link]
import sys
clasa Solu ț ie(obiect):
def maxSubArray(self, nums):
"""
:tip nums: List[int]
:rtype: int
"""
dacă nums == []:
return 0
elif len(nums) == 1:
returna ț i nums[0]
elif len(nums) == 2:
returnează max(nums[0], nums[1], nums[0]+nums[1])
altfel:
all_neg = True
pentru intrările din nums:
dacă intrările >= 0:
all_neg = False
dacă all_neg == Fals:
curr_sum = 0
max_sum = - [Link] - 1
pentru i în intervalul(len(nums)):
curr_sum += nums[i]
dacă curr_sum < 0:
curr_sum = 0
dacă curr_sum > max_sum:
max_sum = curr_sum
returnează max_sum
altfel:
returnează max(nums)
176
Subvector maxim
177
Cel mai bun timp pentru a cumpăra ș i vinde acț iuni II
Să spunem că ai un array pentru care elementul i este preț ul unei acț iuni date pe
zi
Proiectaț i un algoritm pentru a găsi profitul maxim. Puteț i finaliza cât mai multe
tranzacț ii după cum doriț i (adică, cumpăraț i o acț iune ș i vindeț i o acț iune a stocului de mai multe ori)
URL: [Link]
178
Găsiț i minimul într-un tablou sortat rotit
URL: [Link]
returnează nums[start]
179
Triunghiul lui Pascal
Având un număr de rânduri, generaț i primele număr de rânduri ale triunghiului lui Pascal.
[
[1],
[1,1]
[1,2,1]
[1,3,3,1]
[1,4,6,4,1]
]
URL: [Link]
180
Triunghiul lui Pascal
result = []
pre = []
[Link](1)
[Link](pre)
curr = []
[Link](1)
pentru j în intervalul(0, len(pre)-1):
[Link](pre[j]+pre[j+1])
[Link](1)
[Link](curr)
pre = curr
return result
181
Triunghiul lui Pascal II
De exemplu, dat k = 3,
Întoarce-te [1,3,3,1].
Note:
Ai putea să-ț i optimizezi algoritmul pentru a folosi doar O(k) spaț iu suplimentar?
URL: [Link]
curr = []
[Link](1)
pentru j în intervalul (0, len(pre) - 1):
[Link](pre[j]+pre[j+1])
[Link](1)
pre = curr
returna ț i pre
182
Summary Ranges
Având un tablou de întregi sortat fără duplicate, returnaț i rezumatul intervalelor sale.
URL: [Link]
[Link](self.to_str(start, end))
returnează res
183
Număr Lipsă
Având un tablou care conț ine numere distincte luate din0, 1, 2, ..., n, găsi
cel care lipseș te din matrice.
De exemplu,
Givennums= [0, 1, 3]întoarce2.
Notă:
Algoritmul tău ar trebui să ruleze cu o complexitate de timp liniară. Ai putea să-l implementezi?
folosind doar complexitate constantă a spaț iului suplimentar?
URL:[Link]
return None
altfel:
xor_prod = 0
xor_prod_index = 0
xor_prod_index ^= i
pentru i în intervalul(len(nums)):
xor_prod ^= nums[i]
184
Anagramă validă
Anagram valid
Având două ș iruri s ș i t, scrie o funcț ie pentru a determina dacă t este un anagramă a lui s.
De exemplu, s = "anagram", t = "nagaram", returnează adevărat. s = "ș obolan", t = "maș ină", returnează
fals.
URL:[Link]
altfel:
întoarce False
185
Palindrom Valabil
Palindrom valabil
Având un ș ir, determină dacă este un palindrom, având în vedere doar caracterele alfanumerice.
caractere ș i ignorând cazurile.
De exemplu, "Un bărbat, un plan, un canal: Panama" este un palindrom. "cursa o maș ină" este
nu este un palindrom.
Notă: Ai luat în considerare că ș irul ar putea fi gol? Aceasta este o întrebare bună
a întreba în timpul unui interviu.
URL:palindrom valid
importa ț i re
clasa Solu ț ie:
# @param {string} s
# @return {boolean}
def estePalindrom(self, s):
dacă len(s) == 0:
returnează Adevărat
altfel:
start = 0
s = [Link]()
newS = [Link](r"[^a-zA-Z0-9]","",s)
sfâr ș it = lungimea(newS) - 1
altfel:
returnează Fals
returnează True
186
Model de cuvinte
Model de cuvinte
Având un model ș i un ș ir de caractere str, verificaț i dacă str urmează acelaș i model.
Aici, urmează înseamnă o potrivire completă, astfel încât există o bijecț ie între o literă în
model ș i un cuvânt non-gol în str.
Examples: pattern = "abba", str = "dog cat cat dog" should return true. pattern =
"abba", str = "dog cat cat fish" should return false. pattern = "aaaa", str = "dog cat
câine pisică" ar trebui să returneze fals. model = "abba", str = "câine câine câine câine" ar trebui să
return false. Nota: Puteț i presupune că modelul conț ine doar litere mici.
str conț ine litere mici separate printr-un singur spaț iu.
URL:[Link]
187
Tiparul cuvintelor
pattern = "abba"
câine pisică pisică câine
soln = Solu ț ie()
print([Link](pattern, str))
188
Paranteze valide
Paranteze valide
Având un ș ir care conț ine doar caracterele '(', ')', '{', '}', '[' ș i ']', determină dacă
ș irul de intrare este valid.
The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]"
ș i "([)]" nu sunt.
URL:Paranteze valide
189
Paranteze valide
[Link](symbol)
altfel:
dacă stiva == []:
balanced = False
altfel:
top = [Link]()
dacă nu se potrivesc([Link](top,symbol)):
balanced = False
index = index + 1
altfel:
returnează False
openings = "({["
closings = ")}]"
190
Ș iruri izomorfe
Ș iruri izomorfe
Având două ș iruri s ș i t, determină dacă sunt izomorfe.
Două ș iruri sunt izomorfe dacă caracterele din s pot fi înlocuite pentru a obț ine t.
Toate apariț iile unui caracter trebuie să fie înlocuite cu un alt caracter în timp ce
păstrând ordinea caracterelor. Nici doi caractere nu pot fi mapate la acelaș i
un caracter, dar un caracter poate corespunde cu sine.
URL: [Link]
191
Ș iruri izomorfe
returnează True
altfel:
dacă len(s) != len(t):
returnează Fals
lookup = {}
pentru i în intervalul(0, len(s)):
c1 = s[i]
c2 = t[i]
întoarce Adevărat
192
Inversare ș ir
Inversare ș ir
Scrieț i o funcț ie care ia un ș ir ca intrare ș i returnează ș irul invers.
URL:[Link]
i = 0
j = lungimea(s) - 1
în timp ce i < j:
temp = current_str[i]
current_str[i] = current_str[j]
current_str[j] = temp
j -= 1
i += 1
return "".join(current_str)
193
Suma a două întregi
URL:[Link]
194
Număr singular
Număr unic
Dată fiind un tablou de întregi, fiecare element apare de două ori cu excepț ia unuia. Găseș te-l.
singur.
URL:[Link]
xor_prod ^= intrări
return xor_prod
195
Invertiț i Integerul
Inversare Integer
Inversează cifrele unui întreg.
Dacă cifra finală a întregului este 0, care ar trebui să fie ieș irea? Adică, cazuri precum 10,
100.
Ai observat că întregul inversat ar putea provoca o depăș ire? Presupune că inputul este un 32-
un întreg pe 32 de biț i, apoi inversarea lui 1000000003 provoacă o depăș ire. Cum ar trebui să o gestionezi
astfel de cazuri?
Pentru scopul acestei probleme, presupuneț i că funcț ia dumneavoastră returnează 0 atunci când
depăș irile de capacitate ale numărului întors.
URL:[Link]
import sys
clasă Solu ț ie(obiiect):
def inverse(self, x):
"""
:tip x: int
:tip: int
"""
if x < 0:
return -[Link](-x)
result = 0
în timp ce x:
result = result * 10 + x % 10
x /= 10
returnează rezultatul dacă rezultatul <= 0x7fffffff altfel 0
196
Inversarea unui întreg
197
Număr palindrom
Număr palindrom
Determină dacă un număr întreg este un palindrom. Fă asta fără spaț iu suplimentar.
Câteva sugestii: Ar putea numerele întâmplate negative să fie palindromuri? (de exemplu, -1)
De asemenea, ai putea încerca să inversezi un număr întreg. Totuș i, dacă ai rezolvat problema
„Număr întors”, ș tii că numărul întors ar putea depăș i limita. Cum ai
gestionezi un astfel de caz?
URL:[Link]
rev = 0
copie = x
în timp ce copie != 0:
altfel:
returna ț i False
198
Număr palindrom
199
Putere(x,n)
Pow(x,n)
Implementaț i pow(x, n).
v = [Link](x, n//2)
dacă n % 2 == 0:
return v * v
altfel:
return v * v * x
200
Subseturi
Submulț imi
Dat fiind un set de întregi distincte, nums, returnaț i toate submulț imile posibile.
Observaț ie: Setul soluț iilor nu trebuie să conț ină subseturi duplicate.
URL:[Link]
Solution1:
Solution2:
201
Submulț imi
returna ț i rezultatul
dacă (k & 1) == 1:
[Link](nums[index])
k >>= 1
index += 1
returnează res
202
Subsetele II
Submulț imi II
Având o colecț ie de întregi care ar putea conț ine duplicate, nums, returnaț i toate
subseturi posibile.
URL:[Link]
203
Submulț imi II
result = set(result)
return [list(înregistrări) pentru înregistrări în rezultat]
dacă (k & 1) == 1:
[Link](nums[indice])
k >>= 1
index += 1
returnează res
204
Puterea Trei
Puterea Trei
205
Auto-Crossing
Autocruzare
Îț i este dat un tablou x de n numere pozitive. Începi de la punctul (0,0) ș i te miș ti
x[0] metri la nord, apoi x[1] metri la vest, x[2] metri la sud, x[3]
metri spre est ș i aș a mai departe. Cu alte cuvinte, după fiecare mutare, direcț ia ta
se schimbă în sens invers acelor de ceasornic.
Scrieț i un algoritm cu o singură trecere cu spaț iu suplimentar O(1) pentru a determina dacă drumul dvs.
Returnează fals (nu se intersectează singur) Exemplul 3: Dat x = [1, 1, 1, 1], ┌───┐ │ │
└───┼>
URL:[Link]
206
Autocrossare
întoarce False
207
Paint Fence
Vopseș te gardul
Există un gard cu n stâlpi, fiecare stâlp poate fi vopsit cu una dintre cele k culori.
Trebuie să vopseș ti toate stâlpii astfel încât să nu fie mai mult de două stâlpi de gard adjacenti.
au aceeaș i culoare.
URL:[Link]
return dp[3]
208
Comutator de lămpi
Comutator de Becuri
Există n becuri care sunt iniț ial stinse. Mai întâi, aprinzi toate becurile. Apoi, stingi
opri fiecare a doua lampă. La a treia rundă, comuț i fiecare a treia lampă (pornind dacă
este oprit sau se opreș te dacă este pornit). Pentru a i-a rundă, schimbi starea fiecărei i lămpi. Pentru n-a
rotund, dai doar comutarea ultimei becuri. Găseș te câte becuri sunt aprinse după n runde.
Exemplu:
Dat n = 3.
La început, cele trei becuri sunt [stinse, stinse, stinse]. După prima rundă, cele trei becuri sunt [aprins,
on, on]. After second round, the three bulbs are [on, off, on]. After third round, the
trei becuri sunt [aprins, stins, stins].
URL: [Link]
import matematică
209
Jocul Nim
Jocul Nim
Joci următorul joc Nim cu prietenul tău: Există un teanc de
piatră pe masă, de fiecare dată când unul dintre voi îș i ia rândul să îndepărteze 1 până la 3 pietre. A
Cine îndepărtează ultima piatră va fi câș tigătorul. Vei face prima miș care pentru
îndepărtaț i pietrele.
De exemplu, dacă sunt 4 pietre în grămadă, atunci nu vei câș tiga niciodată jocul:
indiferent dacă elimini 1, 2 sau 3 pietre, ultima piatră va fi întotdeauna eliminată de
prietenul tău.
Sfat:
URL:[Link]
210
Roteș te imaginea
Roteș te Imaginea
URL:[Link]
"""
dacă matricea == None sau matricea == []:
trece
altfel:
n = len(matricei)
pentru strat în intervalul(0, n//2):
first = layer
ultimul = n - 1 - strat
pentru i în intervalul (primul, ultimul):
offset = i - prim
top = matrice[first][i]
matrix[first][i] = matrix[last - offset][fir
st]
matrix[last - offset][first] = matrix[last][
ultimul - offset]
matrix[last][last - offset] = matrix[i][last]
]
matrix[i][last] = sus
211
Setaț i matricea la zero
Dată fiind o matrice de m x n, dacă un element este 0, setează întreaga sa linie ș i coloană la 0. Fă această operaț ie în
loc.
URL: [Link]
class Solution(object):
def setZeroes(self, matrice):
"""
:tip matrice: Lista[List[int]]
:rtype: void Nu returna ț i nimic, modifica ț i matricea pe loc
as în schimb.
"""
dacă matrice == None sau len(matrice) == 0:
trece
elif len(matricei) == 1 ș i len(matricei[0]) == 1:
trece
altfel:
rows_with_0 = [False]*len(matrix)
cols_with_0 = [False]*len(matrix[0])
pentru i în intervalul(len(matrice)):
for j in range(len(matrix[0])):
dacă matricea[i][j] == 0:
rows_with_0[i] = True
cols_with_0[j] = True
pentru i în intervalul(len(matricei)):
pentru j în intervalul(len(matrice[0])):
212
Setaț i matricea la zero
pentru j în interval(len(matrice[0])):
dacă matricea[0][j] == 0:
first_row = True
pentru i în intervalul(len(matrice)):
dacă matrice[i][0] == 0:
first_col = True
dacă matrice[i][j] == 0:
matrix[i][0] = 0
matrix[0][j] = 0
dacă first_col:
pentru i în intervalul(len(matrice)):
matrice[i][0] = 0
dacă prima_linie:
pentru i în intervalul(len(matrix[0])):
matrix[0][i] = 0
213
Setaț i zerourile matricei
214
Căutare într-o matrice 2D
Numerele întregi din fiecare rând sunt sortate de la stânga la dreapta. Primul număr întreg din fiecare rând este
215
Caută într-o matrice 2D
r = 0
c = număr_de_coloane - 1
216
Căutarea într-o matrice 2D II
Numerele întregi din fiecare rând sunt sortate în ordine crescătoare de la stânga la dreapta. Numerele întregi din fiecare
[[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23]]
Dat fiind că ț inta = 5, returnează adevărat.
URL: [Link]
217
Caută o matrice 2D II
218
Matrice spirală
Matrice Spirală
Având o matrice cu m x n elemente (m rânduri, n coloane), returnaț i toate elementele ale
matrice în ordine spiralat.
[1,2,3,6,9,8,7,4,5]
URL:[Link]
altfel:
#număr de rânduri
m = len(matricei)
#numărul de coloane
n = len(matrice[0])
#rând de început
k = 0
#începând cu coloana
l = 0
[Link](matrix[k][i])
k += 1
219
Matrice Spirală
s
pentru i în intervalul(k, m):
[Link](matrix[i][n-1])
n-= 1
[Link](matrice[m-1][i])
m -= 1
[Link](matrice[i][l])
l += 1
returna ț i spirala
220
Matricea Spirală II
Matrice spirală II
Dat un număr întreg n, generează o matrice pătrată umplută cu elemente de la 1 la n2 în
ordine spiralată.
URL:[Link]
[[1]]
altfel:
#numărul de rânduri
r = n
#numărul de coloane
c = n
#începutul rândului
k = 0
#începutul coloanei
l = 0
221
Matricea spirală II
matrix[k][i] = count
count += 1
k += 1
matrix[i][c-1] = count
count += 1
c -= 1
dacă k < r:
pentru i în intervalul(c-1, l-1, -1):
matrix[r-1][i] = count
count += 1
r -= 1
matrix[i][l] = count
count += 1
l += 1
returna matricea
222
Design
223
Cache LRU
Cache LRU
Proiectaț i ș i implementaț i o structură de date pentru cache-ul cu cea mai puț in utilizată (LRU).
ob ț ine(key)- Obț ine valoarea (va fi întotdeauna pozitivă) a cheii dacă cheia există în
cache-ul, altfel returnaț i -1.
set(key, value) - Setează sau introdu valoarea dacă cheia nu este deja prezentă.
Când memoria cache a atins capacitatea sa, ar trebui să invalideze cel mai puț in folosit recent.
element înainte de inserarea unui nou element.
224
Cache LRU
clasă LRUCache(object):
value = [Link](key)
[Link][key] = valoare
valoare de returnat
altele:
returnează -1
[Link](key)
[Link][key] = value
altfel:
[Link][key] = value
225
Cache LRU
226