Artikelverzeichnis
Thema
Sie erhalten ein ganzzahliges Array nums der Länge n mit Indizes beginnend bei 0.
Sie können spezielle Operationen für Nums beliebig oft (oder 0 Mal) ausführen. Für jeden Spezialvorgang müssen Sie die folgenden Schritte der Reihe nach ausführen:
Wählen Sie einen Index i und eine positive ganze Zahl x aus dem Bereich [0, n - 1]. Addieren Sie |nums[i] - x| zu den Gesamtkosten. Ändern Sie
nums[i] in x. Wenn eine positive ganze Zahl aufrecht und rückwärts gleich gelesen wird, dann nennen wir die Zahl ein Palindrom. Beispielsweise
sind 121, 2552 und 65756 alle Palindrome, aber 24, 46 und 235 sind keine Palindrome.Wenn alle Elemente in einem Array gleich einer ganzen Zahl y sind und y eine Palindromzahl kleiner als 109 ist, dann nennen wir das Array ein gleichwertiges Array.
Bitte geben Sie eine Ganzzahl zurück, die den minimalen Gesamtaufwand für die Umwandlung von Nums in ein gleiches Array darstellt, nachdem eine beliebige Anzahl spezieller Operationen ausgeführt wurde.
Beispiel 1:
Eingabe: nums = [1,2,3,4,5] Ausgabe: 6 Erläuterung: Wir können alle Elemente im Array in Palindromzahlen 3 umwandeln, um ein Array mit gleichen Zahlen zu erhalten, und das Array wird zu
[3,3,3 ,3, 3] 4 Spezialoperationen müssen zu einem Preis von |1 - 3| + |2 - 3| + |4 - 3| + |5 - 3| = 6 durchgeführt werden. Die Gesamtkosten für die Umwandlung aller Elemente in andere Palindrome ist größer als 6.
Beispiel 2:
Eingabe: nums = [10,12,13,14,15] Ausgabe: 11 Erläuterung: Wir können alle Elemente im Array in Palindromzahlen 11 umwandeln, um ein Array mit gleichen Zahlen zu erhalten, und das Array wird zu
[11,11,11 ,11, 11] Es müssen 5 Spezialoperationen mit einem Aufwand von |10 - 11| + |12 - 11| + |13 - 11| + |
14 - 11| + |15 - 11| = 11 durchgeführt werden. Die Gesamtkosten für die Umwandlung aller Elemente in andere Palindrome betragen mehr als 11.
Beispiel 3:
Eingabe: nums = [22,33,22,33,22] Ausgabe: 22 Erläuterung: Wir können alle Elemente im Array in Palindromzahlen 22 umwandeln, um ein Array mit gleichen Zahlen zu erhalten, und das Array wird zu
[22,22,22 ,22, 22] Es müssen 2 Sonderoperationen mit Kosten von |33 - 22| + |33 - 22| = 22 durchgeführt werden.
Die Gesamtkosten für die Umwandlung aller Elemente in andere Palindrome betragen mehr als 22.
Hinweis:
1 <= n <= 105 1 <= nums[i] <= 109
Problem: 100151. Minimale Kosten für die Umwandlung eines Arrays in ein gleichwertiges Array
Ideen
Suchen Sie den Median im gesamten Array, suchen Sie das erste Palindrom um den Median, berechnen Sie den Abstand zwischen diesen beiden Palindromen für alle Werte und geben Sie den relativ kleineren zurück
Die Komplexität
Zeitkomplexität:
Der Hauptgrund ist, dass O(nlogn) benötigt wird.
Raumkomplexität:
Es werden nur Konstanten verwendet, daher ist es O(1)
Code
class Solution:
def minimumCost(self, nums: List[int]) -> int:
nums = sorted(nums)
if len(nums)%2==1:
midval1 = nums[len(nums)//2]
else:
midval1 = (nums[len(nums)//2] + nums[ len(nums)//2 -1 ]) // 2
def check(num):
num = str(num)
left,right = 0,len(num)-1
while left < right:
if num[left] != num[right]:
return False
left += 1
right -=1
return True
def find(midval):
if check(midval):
return [midval,-1]
left = midval-1
right = midval+1
while True:
if check(left):
break
left-=1
while True:
if check(right):
break
right+=1
return [left,right]
s1 = find(midval1)
a,b = s1[0],s1[1]
ans1 = 0
ans2 = 0
for num in nums:
ans1 += abs(a - num)
ans2 += abs(b - num)
return min(ans1,ans2)