一次遍历
n
u
m
s
nums
nums,
i
i
i表示当前位置,如果
n
u
m
s
[
i
]
=
0
nums[i]=0
nums[i]=0,则交换
n
u
m
s
[
i
]
nums[i]
nums[i]和
n
u
m
s
[
p
0
]
nums[p0]
nums[p0]。由于
i
i
i和
p
0
p0
p0都是从左往右,这个交换方式是正确的。
如果
n
u
m
s
[
i
]
=
2
nums[i]=2
nums[i]=2,则交换
n
u
m
s
[
i
]
nums[i]
nums[i]和
n
u
m
s
[
p
2
]
nums[p2]
nums[p2]。这个思路方向正确,但是有个小问题
:
i
:i
:i从左往右,
p
2
p2
p2从右往左。在交换时,可能
n
u
m
s
[
p
2
]
=
n
u
m
s
[
i
]
=
2
nums[p2]=nums[i]=2
nums[p2]=nums[i]=2,交换后,元素不变,但是
i
i
i右移一位,有一个
2
2
2就被落在
i
i
i前面了。为了保证每一个
2
2
2,都被放在数组最后,我们循环交换
n
u
m
s
[
i
]
nums[i]
nums[i]和
n
u
m
s
[
p
2
]
nums[p2]
nums[p2]即可。
四、代码分析
理解思路很重要!
博主欢迎读者在评论区留言,作为日更博主,看到就会回复的。
五、AC
六、复杂度分析
时间复杂度:
O
(
n
)
O(n)
O(n) ,
n
n
n是
n
u
m
s
nums
nums数组的大小。遍历
n
u
m
s
nums
nums的时间复杂度是
O
(
n
)
O(n)
O(n),考虑到
p
2
p2
p2左移,最坏时间复杂度
O
(
2
n
)
O(2n)
O(2n),对应
n
u
m
s
nums
nums全
2
2
2的情况
空间复杂度:
O
(
1
)
O(1)
O(1),除了若干变量使用的常量空间,没有额外使用线性空间。