按照一个数的大小分裂数组,以及荷兰国旗问题

给定一个数组arr, 和一个数num, 请把小于等于num的数放在数组的左边, 大于num的数放在数组的右边。

要求额外空间复杂度O(1), 时间复杂度O(N)。

Python代码

def split_array(arr, num):
    """维持一个小于等于区域的index,
    如果一个数小于等于num,则和index位置交换
    如果一个数大于num,则直接跳下一个
    """
    i = 0
    for j in range(len(arr)):
        if arr[j] > num:
            pass
        else:
            arr[j], arr[i] = arr[i], arr[j]
            i += 1
    return arr

问题二(荷兰国旗问题)
给定一个数组arr, 和一个数num, 请把小于num的数放在数组的左边, 等于num的数放在数组的中间, 大于num的数放在数组的右边。

要求额外空间复杂度O(1), 时间复杂度O(N)

def split_array(arr, num):
    """总体的策略是,遇到小的数字,那么把它往前面移动,遇到大的数字,把它让后面移动,遇到相等的数字,不动
    维持两个三个变量来进行交换 less  , more , current
    其中more的值应该为len(arr),这样在判断的时候多判断一次,并且j-=1写在后面

    more要等于len(arr),并且运算的时候先要减一,否则会出现这种情况:
    [7,6,4,1,2,5,4] 变为[2, 4, 4, 1, 5, 6, 7],因为这种情况下面并没有对中间的1进行排序,少了一次排序的次数
    """
    current = 0
    less = 0
    more = len(arr)
    while(current < more):
        if arr[current] < num:      # 如果小于,那么less和current要进行交换,并且都推进一位
            arr[less], arr[current] = arr[current], arr[less]
            less += 1
            current += 1
        elif arr[current] == num:   # 如果等于,那么直接向下进行
            current += 1
        else:
            more -= 1
            arr[current], arr[more] = arr[more], arr[current]
    return arr


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值