• 小菜鸡c++ LeetCode初级算法之一——数组(删除排序数组中的重复项)


      这是第一次开始写博客,主要是为了方便记忆将刷题学习过程中遇到的各种c++的不会的用法进行总结以便将来进行回顾。

    由于本身基础知识基本为零,所以从初级算法一步步进行学习深入。

    题目描述:

      给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

    不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

    示例 1:

    给定数组 nums = [1,1,2], 
    
    函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 
    
    你不需要考虑数组中超出新长度后面的元素。

    示例 2:

    给定 nums = [0,0,1,1,1,2,2,3,3,4],
    
    函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
    
    你不需要考虑数组中超出新长度后面的元素。

    说明:

    为什么返回数值是整数,但输出的答案是数组呢?

    请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

    你可以想象内部操作如下:

    // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
    int len = removeDuplicates(nums);
    
    // 在函数里修改输入数组对于调用者是可见的。
    // 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
    for (int i = 0; i < len; i++) {
        print(nums[i]);
    }

    代码1:
    class Solution {
    public:
        int removeDuplicates(vector<int>& nums) {
            if(nums.size()<=1)
                return nums.size();       //判断数组长度0或1个元素时直接返回数组长度
            else
            for(int i = 1; i<nums.size();i++)    //数组长度大于1时
            {
                if(nums[i-1]==nums[i])  //一个个与后面进行对比
                {
                    int l1 = i,l2 = i+1;  //如果找到了相同的元素删除
                    nums.erase(nums.begin()+l1,nums.begin()+l2); //用于数组删除的stl容器
                    i--;
                }
            }
            return nums.size();
        }
    };
      本代码使用c++中的erase容器进行删除,两两元素进行对比其中的弊端有两点:
    1.时间空间复杂度大,运行过程中除了第一个与最后一个元素其他元素进行对比了两次或多次。
    2.如果其中相同元素不相邻得到的结果不正确。
    运行结果也是性能极差



    下面进行使用c++自带容器:

    c++ stl集合set介绍

     c++ stl集合(Set)是一种包含已排序对象的关联容器。set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。

    1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素

    2) 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数

    3) 元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同)

    set模板原型://Key为元素(键值)类型

    template <class Key, class Compare=less<Key>, class Alloc=STL_DEFAULT_ALLOCATOR(Key) >

    从原型可以看出,可以看出比较函数对象及内存分配器采用的是默认参数,因此如果未指定,它们将采用系统默认方式。

    set的各成员函数列表如下:

    c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器

    c++ stl容器set成员函数:clear()--清除所有元素

    c++ stl容器set成员函数:count()--返回某个值元素的个数

    c++ stl容器set成员函数:empty()--如果集合为空,返回true

    c++ stl容器set成员函数:end()--返回指向最后一个元素的迭代器

    c++ stl容器set成员函数:equal_range()--返回集合中与给定值相等的上下限的两个迭代器

    c++ stl容器set成员函数:erase()--删除集合中的元素

    c++ stl容器set成员函数:find()--返回一个指向被查找到元素的迭代器

    c++ stl容器set成员函数:get_allocator()--返回集合的分配器

    c++ stl容器set成员函数:insert()--在集合中插入元素

    c++ stl容器set成员函数:lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器

    c++ stl容器set成员函数:key_comp()--返回一个用于元素间值比较的函数

    c++ stl容器set成员函数:max_size()--返回集合能容纳的元素的最大限值

    c++ stl容器set成员函数:rbegin()--返回指向集合中最后一个元素的反向迭代器

    c++ stl容器set成员函数:rend()--返回指向集合中第一个元素的反向迭代器

    c++ stl容器set成员函数:size()--集合中元素的数目

    c++ stl容器set成员函数:swap()--交换两个集合变量

    c++ stl容器set成员函数:upper_bound()--返回大于某个值元素的迭代器

    c++ stl容器set成员函数:value_comp()--返回一个用于比较元素间的值的函数

    c++ stl集合set插入,遍历用法举例

    #include<iostream> 
    #include<set> 
    using namespace std; 
    //set插入元素操作  
    int main() 
    { 
        //定义一个int型集合对象s,当前没有任何元素
        set<int> s; 
        s.insert(8);  //第一次插入8,可以插入  
        s.insert(1); 
        s.insert(12); 
        s.insert(6); 
        s.insert(8);   //第二次插入8,重复元素,不会插入  
        set<int>::iterator it; //定义前向迭代器 
        //中序遍历集合中的所有元素  
        for(it=s.begin();it!=s.end();it++) 
        cout<<*it<<endl;    
        system("pause"); 
        return 0; 
    }
    运行结果:

                 

    后面还没有完善,后续进行修改。。。。

  • 相关阅读:
    python-IO编程
    DNS解析流程
    python-模块
    HTTP协议
    python-函数式编程
    nmap扫描结果的6种端口状态
    python-高级特性
    python-函数
    python-基础
    上传之路
  • 原文地址:https://www.cnblogs.com/pipi-rtq/p/13262693.html
Copyright © 2020-2023  润新知