leetcode刷题,总结,记录,备忘 75

leetcode75

Sort Colors

 

Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue.

Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.

Note:
You are not suppose to use the library's sort function for this problem.

比较简单的题目,但是后面有高的要求,先上简单版的

class Solution {
public:
    void sortColors(vector<int>& nums) {
        vector<int> temp;
        vector<int>::iterator it = nums.begin();
        while ((it = find(it, nums.end(), 0)) != nums.end())
        {
            temp.push_back(*it);
            it++;
        }
        it = nums.begin();
        while ((it = find(it, nums.end(), 1)) != nums.end())
        {
            temp.push_back(*it);
            it++;
        }
        it = nums.begin();
        while ((it = find(it, nums.end(), 2)) != nums.end())
        {
            temp.push_back(*it);
            it++;
        }
        nums = temp;
    }
};


更高级的要求是只有一次遍历,说实话我不会,,,,去查了别人的解法,有了理解。即将0扔到前面,将2扔到后面,如果是 1就不管,我看了别人的写法,,很容易的就理解了流程,但是其中有几个关键点,就是在先判断出是0,就是互换之后,下标不能自增,还应该再循环一次,再判断一下互换了之后的值是不是2,否则才 ++遍历下一个数。其实流程看几次就明白了,再不济就数字带进去试。我在初学变成的时候,看的郝斌的视频,他说过,如果有什么程序流程看不懂啥的,就带数进去试,试几次就懂了,的确是至理名言。

class Solution {
public:
    void sortColors(vector<int>& nums) {
       if (nums.size() <= 1)
       return;
       int s = -1, e = nums.size();
       int it = 0, temp;
       while (it < nums.size())
       {
           if (nums[it] == 0)
           {
               if (it > s)
               {
                   temp = nums[it];
                   nums[it] = nums[++s];
                   nums[s] = temp;
               }
               else it++;
           }else if  (nums[it] == 2)
           {
               if (it < e)
               {
                   temp = nums[it];
                   nums[it] = nums[--e];
                   nums[e] = temp;
               }
               else
               it++;
           }
           else
           it++;
       }
       
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值