leetcode75之颜色分类
Posted RounieJane
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
链接: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不增加。
以上是关于leetcode75之颜色分类的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 数组:75. 颜色分类(计数排序 荷兰国旗问题)