Cho danh sách chuỗi màu chứa "red", "green", "blue". Phân vùng sao cho "red" trước, "green" giữa, "blue" sau (giống Dutch National Flag).
Ví dụ: ["blue","green","blue","red","red"] → ['red','red','green','blue','blue'].
Giải thuật (Đếm và ghi đè - O(n) thời gian, O(1) không gian)
- Khởi tạo 3 con trỏ:
red = 0,green = 0,blue = 0. - Duyệt từng
stringtrongstrs:- Nếu
"red": ghi đèstrs[blue]="blue",;strs[green]="green",;strs[red]="red",. - Nếu
"green": ghi đèstrs[blue]="blue",;strs[green]="green",. - Nếu
"blue": ghi đèstrs[blue]="blue",.
- Nếu
- Trả về
strs.
Ví dụ minh họa
class Solution:
def solve(self, strs):
green = blue = red = 0
for string in strs:
if string == "red":
strs[blue] = "blue"; blue += 1
strs[green] = "green"; green += 1
strs[red] = "red"; red += 1
elif string == "green":
strs[blue] = "blue"; blue += 1
strs[green] = "green"; green += 1
elif string == "blue":
strs[blue] = "blue"; blue += 1
return strs
ob = Solution()
colors = ["blue","green","blue","red","red"]
print(ob.solve(colors)) # Output: ['red', 'red', 'green', 'blue', 'blue']
Đầu vào
["blue","green","blue","red","red"]
Đầu ra
['red', 'red', 'green', 'blue', 'blue']