Tencent 35, le plus grand élément du tableau
Trouvez le k-ème élément le plus grand dans le tableau non trié. Notez que ce que vous devez trouver est le k-ème élément le plus grand après le tri du tableau, pas le k-ème élément différent.
Exemple 1:
Entrée: [3,2,1,5,6,4] et k = 2
Sortie: 5
Vous devez pouvoir utiliser la fonction de partition rapide. L'
étape suivante consiste à écrire correctement la fonction de partition.
Python écrit 8 lignes de la fonction de partition. Parmi elles, les lignes 1, 2, 7, 8 sont faciles à retenir. La
première ligne, pivot prend la première valeur d'élément à gauche,
Dans la deuxième ligne, le déplacement j commence également à gauche (garantissez que nums [j] lui-même doit être inférieur ou égal à pivot, et l'initiale est égale à)
. La troisième ligne fait attention à la plage, i commence à gauche + 1, car le point de pivot n'a pas besoin d'être comparé à lui-même.
Notez à la ligne 4 que nums [i] et pivot sont comparés, le signe égal n'est pas impliqué, nums [i] est inférieur à pivot et il y a une opération, nums [i] se déplace vers l'avant et vers l'avant est lié à j. La
cinquième ligne est la plus importante parce que nums [j] Il doit être inférieur ou égal à pivot (la valeur initiale de nums [j] le prouve également), il n'est donc pas nécessaire d'échanger directement nums [j] et nums [i], et nums [j + 1] n'est pas nécessairement, nums [j +1] peut être supérieur ou égal à pivot, et il doit y avoir, si nums [j +1] <pivot, j + 1 = i, alors échanger nums [j +1] et nums [i] , Si nums [j +1]> pivot, il est plus raisonnable d'échanger nums [j +1] et nums [i]. En résumé, on peut comprendre pourquoi la cinquième étape a j = j + 1 La
sixième ligne complète l'échange de nums [j] et nums [i] (à ce moment j est déjà ajouté par 1) La
septième ligne déplace la gauche initiale et déplace La position d'échange de j (vérifie également que nums [j] ci-dessus doit être inférieur ou égal à pivot, et nums [j + 1] n'est pas nécessairement)
renvoie j, l'indice de pivot
class Solution:
def partition(self,nums,left,right):
pivot=nums[left]
nums[left],nums[right]=nums[right],nums[left]
store_index=left
for i in range(left,right+1):
if nums[i]<pivot:
nums[store_index],nums[i]=nums[i],nums[store_index]
store_index+=1
nums[store_index],nums[right]=nums[right],nums[store_index]
return store_index
def findKthLargest(self, nums: List[int], k: int) -> int:
ture_k=len(nums)-k
left,right=0,len(nums)-1
while(True):
tmp=self.partition(nums,left,right)
if tmp==ture_k:return nums[tmp]
elif tmp<ture_k:left=tmp+1
else:right=tmp-1