zoukankan      html  css  js  c++  java
  • leetcode 75(原地单双指针)

    本来这个题,看一眼上去就应该是sort排序(所以我写了一行sort直接A了,,,)

    实际这个题可以用移动指针的方法,,

    首先看单指针:

    单指针遍历两边,遇见了就换

     1 class Solution {
     2 public:
     3     void sortColors(vector<int>& nums) {
     4         int n = nums.size();
     5         int ptr = 0;
     6         for (int i = 0; i < n; ++i) {
     7             if (nums[i] == 0) {
     8                 swap(nums[i], nums[ptr]);
     9                 ++ptr;
    10             }
    11         }
    12         for (int i = ptr; i < n; ++i) {
    13             if (nums[i] == 1) {
    14                 swap(nums[i], nums[ptr]);
    15                 ++ptr;
    16             }
    17         }
    18     }
    19 };

    时间复杂度O(nums.size())

    空间复杂度O(1)

    双指针(我觉得我不太适合写双指针orz,里面有很多需要注意的东西)

    要注意p0,p1的含义

    p0说明这个玩意之前是0

    p1说明这个之前是1

    你要明白如果你把0放好了,就不能再动了(因为0已经是搞在了最前面)

    所以如果p0向后移动,p1也必须要一起移动

    还有一个问题就是,p1在p0前面了,结果忽然遇见一个0

    这个时候往往是这样:

    前面一堆0然后第一个1标记为p1,后面是一堆1

    这个时候i忽然遇见一个0,跟0交换的就是1了 

    但实际上1 也已经是排好了的

    所以这个时候没有办法,只能把原来的第一个1放到i的位置,然后把0放过来

    class Solution {
    public:
        void sortColors(vector<int>& nums) {
            int n = nums.size();
            int p0 = 0, p1 = 0;
            for (int i = 0; i < n; ++i) {
                if (nums[i] == 1) {
                    swap(nums[i], nums[p1]);
                    ++p1;
                } else if (nums[i] == 0) {
                    swap(nums[i], nums[p0]);
                    if (p0 < p1) {
                        swap(nums[i], nums[p1]);
                    }
                    ++p0;
                    ++p1;
                }
            }
        }
    };

    总之,双指针的坑太多了啊啊啊啊!!!!!!

  • 相关阅读:
    Java中Filter、Servlet、Listener的学习 (转)
    Servlet 获取商品信息作业
    Servlet 注册与提交作业
    jsp servlet的区别和联系(转)
    用户注册验证留言程序
    作业1
    简单新闻发布系统
    webform 增速删改查 方法
    存取数据库图片
    打印 保存
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/13777768.html
Copyright © 2011-2022 走看看