一、题目
题目链接: https://leetcode-cn.com/problems/remove-element/
二、分析与代码
这个其实跟之前的题目,查找重复元素,很类似,我就想着逐个遍历就好了,不符合要求的放到最后,最后的那个放到最前面。
class Solution { public: int removeElement(vector<int>& nums, int val) { //不需要改变数组大小,只需要输出数组剩余数目n,以前打印前n个元素不含有val即可 //数组长度 int length = nums.size(); //std::cout<<"number : "<<length<< std::endl; // int start = 0; int end = length-1; while(start <= end) { if(nums[start] != val) start++; else{ //交换当前数字 nums[start] = nums[end]; end--; } } return start; } };
效果如下,但是说实话这个有很大差异,看看就得,没啥大用。
三、参考方法
代码随想录的方法在这里。
其主要使用了快慢指针方法,与我的差不多,但是我的会少一点,但是两个的时间复杂度基本上都是在O(n)。我的方法在平均意义上会少一点。
// 时间复杂度:O(n) // 空间复杂度:O(1) class Solution { public: int removeElement(vector<int>& nums, int val) { int slowIndex = 0; for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) { if (val != nums[fastIndex]) { nums[slowIndex++] = nums[fastIndex]; } } return slowIndex; } };