1st__27. Remove Element__【400_LeetCode之路】

从 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循环结束后返回的
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值