对三个数值进行排序

# 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值