leetcode27:移除元素

笑着哭i 提交于 2020-02-27 01:49:33

题目的意思是不要额外新增数组,消耗内存。

一开始采用了笨方法,即删除一个字符时,就再循环一遍。那么就很浪费时间,时间复杂度应该是O(N2)O(N^2)

int benfangfa(vector<int>& nums, int val)
{
    int num = nums.size();
    int num1 = nums.size();
    for(int i = 0; i < num1; i ++)
    {
        for(int  j = 0; j < num;  j++)
        {
            if(nums[j] == val)
          {
            nums.erase(nums.begin() + j );
            num --;
            break;
          }
        }
    }
    cout << "num is " << num << endl;
    return num;
}

然后精简了一下,在循环中当向量值等于需要消除的值时,令变量i置为0,相当于重新循环。但是这里犯了一个错误,for循环是执行完括号内容再++的,所以此处应该令i = -1,这样的话执行完i+1刚好等于0。

int benfangfa2(vector<int>& nums, int val)
{
	int num = nums.size() ;
	for(int i=0; i < num ; i ++)
	    {
	        if (nums[i] == val) {
	            nums.erase(nums.begin() + i);
	            i = -1;
	            num --;
	        }
	    }
   }

好了,接下来看了看别人的思路,双指针,貌似这个方法比较好,双指针的意思就是,一个指针指向比较小的元素,一个指针指向比较大的元素。将不等于val的元素从索引0处开始覆盖数组,这样时间复杂度就从O(N2)O(N^2)下降为O(N)O(N)

int haofangfa(vector<int>& nums,int val)
{
    int size = 0;
    for(int i = 0; i < nums.size(); i ++) {
        if (nums[i] != val)
        {
            nums[size++] = nums[i];
        }
    }
    cout << "size is :" << size << endl;
}

知识点:

  1. vector消除指定元素:
vevtor.erase(vector.begin() + 2);//指定消除第三个元素
  1. 双指针的用法
nums[size++] = nums[i]; // 等式左边索引和右边不同
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!