Leetcode(1)——数组——移除元素

27. 移除元素

题目大意:
给一个数组,以及一个val,在保证空间复杂度为O(1)的基础上移除值为val的元素,并返回新数组的长度。

思路:
因为要保证空间复杂度为O(1),所以不能新建数组,所以利用双指针,一个指向头,一个指向尾,头指针用来判断当前指向的值是否等于val,尾指针指向的位置用来存放接收的val值(实际不用接收,只需要把尾指针指向的元素赋给 值为val的头指针位置即可。

题解:

/*==================================
	这个方法的缺陷就是 不稳定
	保留的数字的相对顺序改变了
===================================*/
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        if(nums.size() == 0)
            return 0;

        int i = 0, j = nums.size()-1;
   
        while(i != j)
        {
            if(nums[i] == val){
                nums[i] = nums[j];
                --j;
            }   
            else
            {
                ++i;
            }
        }

        if(nums[i] == val)
            return i;
        else
            return i+1;
    }
};

283. 移动零

题目大意:
将0元素移动到数组的尾部, 同时保证 其余非0元素的相对位置不变,所以不能用上面的方法。

思路:
同样还是双指针,思路跟上面的27差不多,只不过这个两个指针都是从头开始。

题解:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int fast = 0, slow = 0;
        int length = nums.size();

        while(fast < length)
        {
            if(nums[fast] != 0)
            {
                nums[slow++] = nums[fast++];
            }
            else
            {
                ++fast;
            }
        }

        for(int i = slow; i < length; ++i)
            nums[i] = 0;
    }
};

待做:

26、844、977

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值