从 https://cspiration.com/leetcodeClassification 上的清单开始
第一种方法:
/// Source : https://leetcode.com/problems/remove-element/
/// Author : liuyubobobo
/// Time : 2016-12-05
#include <iostream>
#include <vector>
#include <cassert>
#include <stdexcept>
using namespace std;
/// Two Pointers
/// Move the deleted element to the last
/// This method would be save the unnecessary copy when the removed element is rare.
/// 省去了当数组很少时的拷贝的过程,节省了内存
/// Time Complexity: O(n)
/// Space Complexity: O(1)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int newl = nums.size(); //定义一个整数,让它记录数的大小
int i = 0;
while (i < newl) //当i<new1时,一直循环
if (nums[i] == val)
{
//cout << newl-- << endl; //执行这一步时,newl = 4 newl-- = 4 它的值还没变
//cout << --newl << endl; //执行这一步时,newl = 4 --newl = 3 它的值变了
//当 nums[i] == val,让nums[i] = nums[--newl] 等于倒数第一个值,此时并没有i++,而是重新判断 新的 nums[i] == val是否正确,
//不正确时,i++,在进行num数组中下一个值,这样获得的数组并不是和原来数组中的数顺序相同,但不影响最终结果
nums[i] = nums[--newl]; //
}
else
{
i++;
}
return newl; //返回数的大小
}
};
// ********************************************************
// 以下是完整程序
// ********************************************************
// /// Source : https://leetcode.com/problems/remove-element/
// /// Author : liuyubobobo
// /// Time : 2016-12-05
// #include <iostream>
// #include <vector>
// #include <cassert>
// #include <stdexcept>
// using namespace std;
// /// Two Pointers
// /// Move the deleted element to the last
// /// This method would be save the unnecessary copy when the removed element is rare.
// /// 省去了当数组很少时的拷贝的过程,节省了内存
// /// Time Complexity: O(n)
// /// Space Complexity: O(1)
// class Solution {
// public:
// int removeElement(vector<int>& nums, int val) {
// int newl = nums.size(); //定义一个整数,让它记录数的大小
// int i = 0;
// while (i < newl) //当i<new1时,一直循环
// if (nums[i] == val)
// {
// //cout << newl-- << endl; //执行这一步时,newl = 4 newl-- = 4 它的值还没变
// //cout << --newl << endl; //执行这一步时,newl = 4 --newl = 3 它的值变了
// //当 nums[i] == val,让nums[i] = nums[--newl] 等于倒数第一个值,此时并没有i++,而是重新判断 新的 nums[i] == val是否正确,
// //不正确时,i++,在进行num数组中下一个值,这样获得的数组并不是和原来数组中的数顺序相同,但不影响最终结果
// nums[i] = nums[--newl]; //
// }
// else
// {
// i++;
// }
// return newl; //返回数的大小
// }
// };
// int main() {
// vector<int> nums = { 3, 2, 2, 3 ,8, 9, 3 };
// int val = 3;
// cout << "子函数"<<endl;
// cout << Solution().removeElement(nums, val) << endl;
// //下面的 程序没有太大用处,只用来理解
// cout << "主函数" << endl;
// int i = 0;
// while (i < nums.size()) //当i<new1时,一直循环
// cout << nums[i++] << endl;
// cout << nums.size() << endl; //没有改变数组的大小,但最后可以通过控制 输出的角标 来获得去除目标值之后 的数组,因为获得了有效数据的值
// system("pause");
// return 0;
// }
第二种方法
/// Source : https://leetcode.com/problems/remove-element/
/// Author : liuyubobobo
/// Time : 2016-12-05
#include <iostream>
#include <vector>
#include <cassert>
#include <stdexcept>
using namespace std;
/// Two Pointers 两个指针,这个不叫指针,叫啥呢?
/// Time Complexity: O(n) 时间复杂度
/// Space Complexity: O(1) 空间复杂度
class Solution {
//公开的
public:
int removeElement(vector<int>& nums, int val) {
int j = 0;
for( int i = 0 ; i < nums.size() ; i ++ )
if( nums[i] != val )
nums[j++] = nums[i];
return j; //返回j是为了告知最终vector中剩余多少元素,不是多次返回,而是for循环结束后返回的
}
};