143. 排颜色 II

143. 排颜色 II

中文English

给定一个有n个对象(包括k种不同的颜色,并按照1到k进行编号)的数组,将对象进行分类使相同颜色的对象相邻,并按照1,2,...k的顺序进行排序。

样例

样例1

输入: 
[3,2,2,1,4] 
4
输出: 
[1,2,2,3,4]

样例2

输入: 
[2,1,1,2,2] 
2
输出: 
[1,1,2,2,2]

挑战

一个相当直接的解决方案是使用计数排序扫描2遍的算法。这样你会花费O(k)的额外空间。你否能在不使用额外空间的情况下完成?

注意事项

  1. 不能使用代码库中的排序函数来解决这个问题
  2. k <= n
输入测试数据 (每行一个参数)如何理解测试数据?

 背向型双指针(三指针) +  不停划分区间排序(循环k,小的放置左边,大的放置右边,往右边走,缩小区间)

class Solution:
    """
    @param colors: A list of integer
    @param k: An integer
    @return: nothing
    """
    def sortColors2(self, colors, k):
        # write your code here
        #一层一层往下划分,小于k的放置左边,大于k的放置右边,left会随着k更新
        #背向型双指针
        
        length = len(colors)
        #left只需要重置第一次即可,后面的会更新,一直不停的缩小区间,来进行划分数组,往右边走
        left = 0
        index = 0
        
        #最外层
        for i in range(1, k + 1):
       #right每次需要重置,left不需要,left和index为起点指向,index正常走,left记录小于i的个数,缩小区间. right
= length - 1 #里面不停的进行划分 while index <= right: #放置左边 if (colors[index] < i): colors[index], colors[left] = colors[left], colors[index] index += 1 left += 1 elif (colors[index] > i): colors[index], colors[right] = colors[right], colors[index] right -= 1 else: index += 1 #此时已经划分完毕当前i的,如果是小于i的左边,大于i的右边,只需要关心大于i的部分即可,更新index index = left return colors

 

posted @ 2020-06-27 21:27  风不再来  阅读(157)  评论(0编辑  收藏  举报