• Leetcode刷题75. 颜色分类


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

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

    必须在不使用库内置的 sort 函数的情况下解决这个问题。

    示例 1:

    输入:nums = [2,0,2,1,1,0]
    输出:[0,0,1,1,2,2]


    示例 2:

    输入:nums = [2,0,1]
    输出:[0,1,2]
     

    提示:

    n == nums.length
    1 <= n <= 300
    nums[i] 为 0、1 或 2
     

    进阶:

    你能想出一个仅使用常数空间的一趟扫描算法吗?

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/sort-colors
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    感谢王尼玛千里长安的详细解法,传送门动画演示 75. 颜色分类[JAVA] 0ms 100 % 一次遍历​​​​​​​

    1. class Solution {
    2. public void sortColors(int[] nums) {
    3. // sortColorsI(nums);
    4. // sortColorsII(nums);
    5. // sortColorsIII(nums);
    6. sortColorsIIII(nums);
    7. }
    8. //方法四:刷油漆法
    9. //遍历数组,先将数组值全部赋值2;遇到<=1的,将元素赋值1,并记录0和1的次数,作为数字1的右侧边界;
    10. //遇到等于0,将元素赋值0,并记录0的次数,作为数字0的右侧边界
    11. //时间复杂度O(N),空间复杂度O(1)
    12. private void sortColorsIIII(int[] nums) {
    13. int zero = 0, one = 0;
    14. for (int i = 0; i < nums.length; i++) {
    15. int temp = nums[i];
    16. nums[i] = 2;
    17. if (temp <= 1) {
    18. nums[one] = 1;
    19. one++;
    20. }
    21. if (temp == 0) {
    22. nums[zero] = 0;
    23. zero++;
    24. }
    25. }
    26. }
    27. //方法三:荷兰国旗问题
    28. //定义三个指针p0,cur,p2,p0和cur初始指向数组头部,p2初始指向数组尾部,指针cur遍历数组
    29. //当cur遇到0时与p0交换,这样0就被交换到了数组头部,p0和cur同时前进;
    30. //当cur遇到2时,cur与p2交换,这样2就被交换到了数组尾部,p2前进,cur不前进
    31. //遇到1时,cur继续前进,不做交换
    32. //时间复杂度O(N),空间复杂度O(1)
    33. private void sortColorsIII(int[] nums) {
    34. int p0 = 0, cur = 0, p2 = nums.length - 1;
    35. while (cur <= p2) {
    36. if (nums[cur] == 0) {
    37. swap(nums, p0, cur);
    38. p0++;
    39. cur++;
    40. } else if (nums[cur] == 2) {
    41. swap(nums, p2, cur);
    42. p2--;
    43. } else {
    44. cur++;
    45. }
    46. }
    47. }
    48. //方法二:定义双指针i和j,i和j一开始都指向数组头部,j不断的往前走
    49. //当j指向元素0时,交换i和j指向的元素,等遍历结束后,数字0就相对有序了
    50. //按照同样方式处理数字1,当数字0和1处理完时,整个数组也就有序了
    51. //时间复杂度O(N),空间复杂度O(1)
    52. private void sortColorsII(int[] nums) {
    53. if (nums == null || nums.length == 0) {
    54. return;
    55. }
    56. int i = 0;
    57. for (int j = 0; j < nums.length; j++) {
    58. if (nums[j] == 0) {
    59. swap(nums, i, j);
    60. i++;
    61. }
    62. }
    63. for (int j = i; j < nums.length; j++) {
    64. if (nums[j] == 1) {
    65. swap(nums, i, j);
    66. i++;
    67. }
    68. }
    69. }
    70. //方法一:遍历数组分别统计0,1,2出现的次数,然后再遍历数组对数组进行重写。
    71. //时间复杂度O(N),空间复杂度O(1)
    72. private void sortColorsI(int[] nums) {
    73. int zero = 0, one = 0, two = 0;
    74. for (int num : nums) {
    75. if (num == 0) {
    76. zero++;
    77. } else if (num == 1) {
    78. one++;
    79. } else {
    80. two++;
    81. }
    82. }
    83. for (int i = 0; i < nums.length; i++) {
    84. if (i < zero) {
    85. nums[i] = 0;
    86. } else if (i < zero + one) {
    87. nums[i] = 1;
    88. } else if (i < zero + one + two){
    89. nums[i] = 2;
    90. }
    91. }
    92. }
    93. private void swap(int[] nums, int i, int j) {
    94. int temp = nums[i];
    95. nums[i] = nums[j];
    96. nums[j] = temp;
    97. }
    98. }

  • 相关阅读:
    SDP最佳实践丨为汽车品牌 L 铸造「数字化营销+管控」
    DFS、BFS详解之二维矩阵路径问题
    SpringBoot整合Swagger
    cpu设计和实现(协处理器cp0)
    MySQL分区
    springboot+Vue实现分页
    JavaScript课堂练习
    API接口:概述、设计、应用与未来趋势
    Swin transformer v2和Swin transformer v1源码对比
    Java中三种I/O模型 BIO,NIO,AIO
  • 原文地址:https://blog.csdn.net/Bonbon_wen/article/details/128125280