partition问题

class Partition:
    # partition过程
    # 给定一个数组arr,和一个整数num。请把小于等于num的数放在数组左边,
    # 大于num的数放在数组的右边。这里num为数组的r
    # 要求额外空间复杂度为O(1),时间复杂度为O(N)
    def partition(self, arr, l, r):
        if l > r:
            return -1
        if l == r:
            return l
        less_equal = l-1
        index = l
        # index < r ,则不包括r位置。
        # 最后,将大于区域的第一个与r交换,此时r是==r的最后一个
        while index < r:
            if arr[index]<=arr[r]:
                less_equal += 1
                self.swap(arr, index, less_equal)
            index += 1   
        less_equal += 1  # 大于区域的第一个
        # 最后,将大于区域的第一个与r交换,此时r是==r的最后一个
        self.swap(arr, less_equal, r)
        return less_equal

    def swap(self, arr, i, j):
        temp = arr[i]
        arr[i] = arr[j]
        arr[j] = temp


partition问题进阶:荷兰国旗问题的划分

class Partition:
    # arr[L...R] 玩荷兰国旗问题的划分,以arr[R]作划分值
    # 三个部分,<arr[R]  ==arr[R]  >arr[R]
    # return ==区域
    def netherlandsFlag(self, arr, l, r):
        if l > r:
            return [-1, -1]
        if l == r:
            return [l, r]
        less = l-1  # <arr[R]区域左边界
        index = l  # 从l位置开始遍历
        more = r  # >arr[R]区域左边界,先把r位置包住,partition过程中,r先不动
        while index < more:
            if arr[index] == arr[r]:
                index += 1
            elif arr[index] < arr[r]:
                less += 1
                self.swap(arr, index, less)
                index += 1
            else:
                more -= 1
                self.swap(arr, index, more)
        # l...less  less+1...more-1  more...r-1   r
        # l...less  less+1...more    mor+1...r
        # 最后,将大于区域的第一个与r交换,此时r是==r的最后一个
        self.swap(arr, more, r)
        return [less+1, more]

    def swap(self, arr, i, j):
        temp = arr[i]
        arr[i] = arr[j]
        arr[j] = temp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值