zoukankan      html  css  js  c++  java
  • 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不增加。

  • 相关阅读:
    docker (centOS 7) 使用笔记3
    docker (centOS 7) 使用笔记4
    docker (centOS 7) 使用笔记2
    docker (centOS 7) 使用笔记1
    docker (centOS 7) 使用笔记3
    CentOS7 修改时区、charset
    p12(PKCS12)和jks互相转换
    tomcat7 日志设置为log4j
    Redis概述与基本操作
    Django学习笔记之安全
  • 原文地址:https://www.cnblogs.com/rounie/p/13084228.html
Copyright © 2011-2022 走看看