数组中未出现的最小正整数

给定一个无序数组arr,找到数组中未出现的最小正整数
例如
arr = [-1, 2, 3, 4]。返回1
arr = [1, 2, 3, 4]。返回5
arr = [6, 1, 2, 3, 4, 7]。返回5
[要求]
时间复杂度为O(n),空间复杂度为O(1)

0 8 [33, 6, -1, -1, 1, 2, 3, 5]
0 7 [5, 6, -1, -1, 1, 2, 3, 5]
0 7 [1, 6, -1, -1, 5, 2, 3, 5]
1 7 [1, 6, -1, -1, 5, 2, 3, 5]
1 7 [1, 2, -1, -1, 5, 6, 3, 5]
2 7 [1, 2, -1, -1, 5, 6, 3, 5]
2 6 [1, 2, 3, -1, 5, 6, 3, 5]
3 6 [1, 2, 3, -1, 5, 6, 3, 5]
3 5 [1, 2, 3, 6, 5, 6, 3, 5]
3 4 [1, 2, 3, 5, 5, 6, 3, 5]
def solver(nums)
    left = 0
    right = len(nums)
    while(left < right):
        print(left,right,nums)
        if nums[left] == left + 1: #[1,2,3,...] 值和位置满足条件
            left+=1
        elif nums[left] <= left or nums[left] > right or nums[left] == nums[nums[left]-1]:  # 重复或者负数、大于right,
            right-=1
            nums[left] = nums[right]
        else:
            flag = nums[left] - 1
            nums[left], nums[flag] = nums[flag], nums[left]
    return left + 1

原文地址:https://www.cnblogs.com/sandy-t/p/13562428.html