当前位置 博文首页 > Remove Element_让代码改变世界:LeetCode 27

    Remove Element_让代码改变世界:LeetCode 27

    作者:[db:作者] 时间:2021-07-10 18:54

    这个题亦不是很难,并没有太多可说的,我们尽快结果了它吧。

    题目也是要从数组中移除元素的,但算法还是有点儿小差别的,算是两个不同的小技巧吧。看题

    Given an array and a value, remove all instances of that value in place and return the new length.

    The order of elements can be changed. It doesn't matter what you leave beyond the new length.

    这和上面一题有两个差别,一是这个数组不是有序的,而且要删除的元素已经给出来了,最后还“此地无银三百两”的告诉你可以改变数组中元素的位置。其实这已经提示是要改变元素顺序才能应用我们的小技巧了。

    到底是什么技巧呢?我们来分析一下,上面一题的技巧关键在于一步到位即不会对一个数字移动两次。这个是有在有序数组的条件下才可以完成。而这个题目是无序数组,如果也按照前面的方法,那我们不知道第二个指针应该放到哪儿,所以我们删除掉给定值后,应该用最后面的元素来填充,因为只有这样数组才是连续的且不需要移动任何元素。这也恰好验证了可以改变数字顺序那句话。有了这个思路,那程序就好说了

    class Solution {
    public:
        int removeElement(vector<int>& nums, int val) {
    		if(nums.size()==0) return 0;
    		vector<int>::iterator itBeg = nums.begin();
    		vector<int>::iterator itEnd = nums.end()-1;
    		while(itBeg<=itEnd)
    		{
    			while(*itBeg!=val && itBeg!=itEnd)
    				itBeg++;
    			while(*itEnd==val && itEnd!=itBeg)
    				itEnd--;
    			if(itBeg==itEnd){
    				if(*itBeg!=val){
    					itBeg++;
    				}break;
    			}
    			else{
    				*itBeg=*itEnd;
    				itBeg++;itEnd--;
    			}
    		}
    		return itBeg-nums.begin();
        }
    };
    显然程序的时间复杂度为O(n)。

    这里面要注意的一点就是当itBeg==itEnd时,这时候要特殊处理一下:如果这时它们指向的元素是该删除的,那不能用*itBeg=*itEnd来赋值,这样是删不掉最后这个数据的。至于应该怎么处理,代码中已经写得很清楚了。只要对指针操作熟悉,应该不会有什么问题。指针及下标对数组的操作是程序设计的基本功,要勤加练习才是啊。

    最后,祝每个坚持的人早日实现自己的梦想。



    cs
    下一篇:没有了