leetcode75之颜色分类

题目描述:

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。  

示例:

输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-colors
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
实现如下:
  1 def sortColors(nums):
  2     '''
  3    使用计数排序思想
  4     :param nums:
  5     :return:
  6     '''
  7     colors = [0] * 3
  8 
  9     for i in nums:
 10         colors[i] += 1
 11 
 12     j = 0
 13     for m in range(3):
 14         for n in range(colors[m]):  # 控制次数
 15             nums[j] = m
 16             j += 1
 17 
 18     return nums
 19 
 20 
 21 print('==============测试colorsort()============')
 22 nums = [2, 1, 1, 0, 2, 1]
 23 result = sortColors(nums)
 24 print("result=", result)
 25 
 26 
 27 def bubbleSort(nums):
 28     '''
 29     实现冒泡排序
 30     :param nums:
 31     :return:
 32     '''
 33 
 34     for i in range(len(nums) - 1):  # 控制循环次数
 35         for j in range(len(nums) - i - 1):  # 控制每次循环时在指定数组长度内进行
 36             if nums[j] > nums[j + 1]:
 37                 nums[j], nums[j + 1] = nums[j + 1], nums[j]
 38             else:
 39                 continue
 40 
 41     return nums
 42 
 43 
 44 print("----------------测试Bubblesort()-------------")
 45 nums = [2, 1, 3, 5, 6, 2, 0, 2, 0, 2]
 46 result = bubbleSort(nums)
 47 print("result=", result)
 48 
 49 
 50 def colorsort1(nums):
 51     '''
 52     使用桶排序思想
 53     :param nums:
 54     :return:
 55     '''
 56     color = [[] for i in range(3)]
 57     for i in nums:
 58         color[i].append(i)
 59 
 60     nums[:] = []
 61 
 62     for i in color:
 63         nums.extend(i)
 64 
 65     return nums
 66 
 67 
 68 print("-----------测试colorsort1()------------")
 69 nums = [2, 1, 2, 1, 0, 1, 0, 0, 2]
 70 result = colorsort1(nums)
 71 print("result=", result)
 72 
 73 
 74 def colorsort2(nums):
 75     '''
 76     荷兰三色旗问题
 77     :param nums:
 78     :return:
 79     '''
 80     p0 = curr = 0
 81     p2 = len(nums) - 1
 82 
 83     while curr <= p2:
 84         if nums[curr] == 0:
 85             nums[p0], nums[curr] = nums[curr], nums[p0]
 86             p0 += 1
 87             curr += 1
 88         elif nums[curr] == 2:
 89             nums[curr], nums[p2] = nums[p2], nums[curr]
 90             p2 -= 1
 91         else:
 92             curr += 1
 93 
 94     return nums
 95 
 96 
 97 print("------------测试colorsort2()--------------")
 98 nums = [2, 0, 2, 0, 0, 1, 1, 1]
 99 result = colorsort2(nums)
100 print("result=", result)

输出:

==============测试colorsort()============
result= [0, 1, 1, 1, 2, 2]
----------------测试Bubblesort()-------------
result= [0, 0, 1, 2, 2, 2, 2, 3, 5, 6]
-----------测试colorsort1()------------
result= [0, 0, 0, 1, 1, 1, 2, 2, 2]
------------测试colorsort2()--------------
result= [0, 0, 0, 1, 1, 1, 2, 2]

总结:上述一共采用四种方法解决该问题。四种方法使用不同的思想方法。这里需要说明一下最后一种荷兰三色旗采用的三指针方法。初始化三个指针分别为p0,curr和p2,p0初始化为指向第一个元素,p2指向最后一个元素,curr指针用来遍历整个数组,指向当前元素,所以初始化也为0。当指向元素为0时,交换当前元素和p0,当指向元素为2时,交换当前元素和p2,再紧接着判断当前元素的值,代码中表现为curr不增加。

原文地址:https://www.cnblogs.com/rounie/p/13084228.html