# coding: utf-8
# Name: coding.py
# Author: tyler
# Data: 2021/10/16
"""
题目:已知一个list,只包含1,2,3,请你在不借用辅助数组的情况下,从大到小进行排序
思路:借助---三指针。
思考:具体解题思路,借鉴数学归纳法,假设前n-1个数已经排好序了,那么如何将最新的数进行插入就是最关键的步骤。
"""
class Solution(object):
def get_res(self, nums):
p1, p2, p3 = -1, -1, -1 # 记录最后一个1,2,3的index
for i in range(len(nums)):
cur = nums[i]
if cur == 1:
if p1 < 0: # 1之前没有出现过
p1 = i
else: # 1之前出现过
p1 += 1 # 更新p1-index
elif cur == 2:
if p2 < 0: # 2之前没有出现过
if p3 >= 0:
# 3出现过,将当前的2与最后一个3之后的数进行替换,并更新p1,p2
self.swap(nums, p3+1, i)
p2 = p3+1
if p1 >= 0:
p1 += 1
else: # 2之前出现过
# 3没有出现过,此时cur=2最大,放到nums开头即可
self.swap(nums, i, 0)
p2 = 0
if p1 >= 0:
p1 += 1
else: # 2之前出现过,将当前的2与第一个1进行替换,并更新p1,p2
self.swap(nums, p2+1, i)
p2 += 1
if p1 >= 0:
p1 += 1
else:
if p3 < 0: # 3之前没有出现过
self.swap(nums, i, 0)
p3 += 1
# 交换完后,如果末尾是1,直接更新p1
if nums[i] == 1:
p1 += 1
# 交换完后,如果末尾是2,还需要再进行一次交换,更新p2、p1
if nums[i] == 2:
self.swap(nums, p2+1, i)
p2 += 1
if p1 >= 0:
p1 += 1
else: # 3之前出现过
self.swap(nums, p3+1, i)
p3 += 1
# 交换完后,如果末尾是1,直接更新p1
if nums[i] == 1:
p1 += 1
# 交换完后,如果末尾是2,还需要再进行一次交换,更新p2、p1
elif nums[i] == 2:
self.swap(nums, p2 + 1, i)
p2 += 1
if p1 >= 0:
p1 += 1
return nums
def swap(self, nums, i, j):
nums[i], nums[j] = nums[j], nums[i]
if __name__ == "__main__":
data = [1,3,3,2,1,3,2]
solu = Solution()
res = solu.get_res(data)
print(res)
04-18