leetcode75之颜色分类
题目描述:
不能使用代码库中的排序函数来解决这道题。
示例:
- 输入: [2,0,2,1,1,0]
- 输出: [0,0,1,1,2,2]
链接: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不增加。