[LeetCode]Remove Element

题目

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.

解析

这个题目的意思就是删除原数组中的所有的指定的元素,并且返回剩余的数组的元素个数。但是不要求保持原来的数组的元素的顺序。

看到这个题目首先想到的是要把所有出现的给定的元素从数组前面移动到最后面,设置一个指针,对数组便利并记录上一个有效元素到当前指针的距离是可以的,时间复杂度也可以遍历一遍搞定。但是,这忽然让我想起了快速排序的划分算法:前面找一个比pivot大的,后面找一个比pivot小的,然后交换他们。这个问题可以模仿:前面找一个指定的元素,后面找一个非指定的元素,交换他们。

算法实现

#include <iostream>
#include <vector>
using namespace std;

int removeElement(vector<int>& nums, int val)
{
	int front = 0;
	int rare  = nums.size() - 1;
	
	int temp;
	while(front <= rare)
	{
		while(front <= rare && nums[front] != val)
		{
			front++;
		}
		while(front <= rare && nums[rare] == val)
		{
			rare--;
		}

		if(front <= rare)
		{
			temp = nums[front];
			nums[front] =  nums[rare];
			nums[rare] = temp;
		}
	}//while

	return front;
}

提示:

在写算法的时候,首先要自己先写一些特殊的和普通的测试用例,编出了的算法首先要能在自己的测试用例中跑的过才行。不然即使算法思路是对的,也会因为一些特殊的测试用例使得算法的实现上出现问题。举个例子就是上面的:

while(front < rare)    //用front < rare做循环的判断条件是会在特殊的测试用例中出错的

直接单指针遍历算法实现

 

你可能感兴趣的:(LeetCode)