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.
算法一:双指针向后移动
此算法在leetcode上执行时间为36ms。
class Solution { public: int removeElement(int A[], int n, int elem) { int num = 0; for (int i=0; i<n; i++) { if (A[i] != elem) A[num++] = A[i]; } return num; } };
算法虽然是O(n),但缺点是数据移动量大。
只要存在一个和elem相同的元素,那意味其后的元素都需要移动。
算法二:首尾双指针向中间移动
此算法可以大量减少移动操作。当遇到和elem相同的元素时,从数组尾部取数来填充。
此算法在leetcode上执行时间为20ms。 比算法一用时明显减少。
class Solution { public: int removeElement(int A[], int n, int elem) { int num = 0; while (num < n) { if (A[num] == elem) A[num] = A[--n]; else ++num; } return num; } };
时间: 2024-11-09 04:56:46