layout: posttitle: PHP 实现颜色分类问题
subtitle: PHP 实现颜色分类问题
date: 2020-06-06
author: he xiaodong
header-img: img/default-post-bg.jpg
catalog: true
tags:
- Go
- PHP
- LeetCode
- 颜色分类

颜色分类

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

注意:
不能使用代码库中的排序函数来解决这道题。

示例:

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

进阶:

  • 一个直观的解决方案是使用计数排序的两趟扫描算法。
  • 首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
    你能想出一个仅使用常数空间的一趟扫描算法吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-colors

解题思路

遍历数据,加以判断,然后原地交换数据。

  • 若遇到0,则与左指针指向元素交换,并将左指针右移一位
  • 若遇到2,则与右指针指向元素交换,并将右指针左移一位,因为交换过来的元素仍可能为2,所以再次对此元素进行判断

PHP 实现
  1. /**
  2. * @param Integer[] $nums
  3. * @return NULL
  4. */
  5. function sortColors(&$nums) {
  6. $left = 0;
  7. $right = count($nums) - 1;
  8. for ($i = 0; $i <= $right; $i++) {
  9. if ($nums[$i] === 0) {
  10. list($nums[$i], $nums[$left]) = [$nums[$left], $nums[$i]];
  11. $left++;
  12. }
  13. else if ($nums[$i] === 2) {
  14. list($nums[$i], $nums[$right]) = [$nums[$right], $nums[$i]];
  15. $right--;
  16. $i--;
  17. }
  18. }
  19. return $nums;
  20. }
  21. return lengthOfLongestSubstring($s = "abcabcbb"); // output: 3

最后恰饭 阿里云全系列产品/短信包特惠购买 中小企业上云最佳选择 阿里云内部优惠券