Sort Colors
这题说实话,最直观的想法没有想到emmmm,先构造一个hash然后在进行重新构造的思想,我觉得挺好的。不过它要求做one-pass,就重新想了一个。这题的主要考点:
- one-pass和two-pass的区别
- test_case的考虑
因为只能扫描数组一遍,所以自然想到肯定是交换,然后又因为这题只有0,1,2三个数,所以只要设置两个指针,碰到0往左交换,碰到2往右交换,就可以了。
只是要注意的一点是,碰到2的时候往右交换,你不知道是不是交换到0,所以遍历的下标不能移动。碰到0的时候往左交换,肯定是没事的,因为左边不可能还有2(如有2肯定就交换过了)
代码
class Solution:
def sortColors(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
l, m, h = 0, 0, len(nums)-1
while(m<=h):
if nums[m] == 1:
m+=1
elif nums[m] == 0:
nums[l], nums[m] = nums[m], nums[l]
l+=1
m+=1
elif nums[m] == 2:
nums[m], nums[h] = nums[h], nums[m]
h-=1
leetcode上最快的代码
我感觉它扫了两遍,其实更慢。不过它提供了一种很好的思路。以后不管0-n,其实都能这样做。
先扫一遍,把最小的放一边,然后从新位置开始再扫一遍,把第二小的放一边
class Solution:
def sortColors(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
zero = 0
for i in range(len(nums)):
if nums[i] == 0:
nums[i], nums[zero] = nums[zero], nums[i]
zero += 1
one = zero
for i in range(one, len(nums)):
if nums[i] == 1:
nums[i], nums[one] = nums[one], nums[i]
one += 1