# A. Min Max Game (opens new window)
Merge list accordingly, until there is only 1 element left.
DETAILS
def minMaxGame(self, A: List[int]) -> int:
while len(A) > 1:
nxt = [0] * (len(A) // 2)
for i in range(len(nxt)):
if i %2==0:
nxt[i] = min(A[i*2], A[i*2+1])
else:
nxt[i] = max(A[i*2], A[i*2+1])
A=nxt.copy()
return A[0]
# B. Partition Array Such That Maximum Difference Is K (opens new window)
Sort array and start iteration from a_0
.
If aj
is larger than ai
by more than k
, we have one extra subarray of ai, ai+1, ... aj-1
.
DETAILS
def partitionArray(self, nums: List[int], k: int) -> int:
nums.sort()
n, minn = 1, nums[0]
for num in nums[1:]:
if num - minn > k:
n+=1
minn = num
return n
# C. Replace Elements in an Array (opens new window)
Use hashmap to store the value-key pair, change value in each queries. Finally, restore the original order using the keys.
DETAILS
def arrayChange(self, A: List[int], O: List[List[int]]) -> List[int]:
d, res = {a : i for i,a in enumerate(A)}, [0] * len(A)
for i,j in O:
d[j]=d[i]
del d[i]
for key in d.keys():
res[d[key]]=key
return res
# D. Design a Text Editor (opens new window)
String operation, maintain a pointer as the cursor.
DETAILS
class TextEditor:
def __init__(self):
self.i, self.s = 0, ""
def addText(self, text: str) -> None:
if not self.s:
self.s = text
else:
self.s = self.s[:self.i] + text + self.s[self.i:]
self.i + =len(text)
def deleteText(self, k: int) -> int:
prev, res = max(0, self.i - k),min(k, self.i)
self.s = self.s[:prev] + self.s[self.i:]
self.i -= res
return res
def cursorLeft(self, k: int) -> str:
self.i -= k
self.i = max(self.i, 0)
if self.i >= 10:
return self.s[self.i-10 : self.i]
else:
return self.s[:self.i]
def cursorRight(self, k: int) -> str:
self.i += k
self.i = min(self.i, len(self.s))
if self.i >= 10:
return self.s[self.i-10 : self.i]
else:
return self.s[:self.i]