leedcode-day2

leedcode26-删除有序数组中的重复项
题目:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

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

题解:
1、双指针:设置快慢指针。fast:用来比较当前元素和前一元素是否重复;slow:用来标记存储不同元素的下标。
初始化时两者都指向下标为1的元素;然后fast开始遍历,遇到重复元素就继续往后遍历,slow指向的位置不变;如果遇到不重复的元素,将fast指向的元素的值赋给slow标记的下标,slow往后移动一位。

2、通用解法:用for循环中的 i 遍历数组,idx标记待插入位置。

  • 由于是保留 k 个相同数字,对于前 k 个数字,我们可以直接保留。
  • 对于后面的任意数字,能够保留的前提是:与当前写入的位置前面的第 k 个元素进行比较,不相同则保留。
class Solution {
public:
    int work(vector<int>& nums, int k) {
        int len = 0;
        for(auto num : nums)
            if(len < k || nums[len-k] != num)
                nums[len++] = num;
        return len;
    }
    int removeDuplicates(vector<int>& nums) {
        return work(nums, 1);
    }
};

ps:代码均复制于leedcode题解

leedcode217-存在重复元素
题目:给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。

题解:
1、排序
先排序再比较相邻元素:如果有重复元素返回true,如果遍历完都没有找到重复元素则返回false。

2、哈希表

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int n = nums.size();
        for (int i = 0; i < n - 1; i++) {
            if (nums[i] == nums[i + 1]) {
                return true;
            }
        }
        return false;
    }
};

补充知识:
1、unodered_set:C++中的一个STL,可以视为一个集合

  • 原理:基于哈希表,数据插入和查找的时间复杂度很低,平均O(n),而代价是消耗比较多的内存,无自动排序功能。
  • 定义:unodered_set< type > set_name;
  • 初始化:unodered_set< type > set_name{“a”,“b”}
  • 插入元素:set_name.insert(element)
    //集合中不存在重复元素;插入过多数据会使哈希表重建rehash。
  • 删除某个元素:set_name.erase(element)
  • 清空集合:set_name.clear()
  • 查找元素:set_name.find(element)
    //找到则返回指向迭代器的类型,没有找到则返回结束迭代器end()

2、set:

  • 原理:基于红黑树实现,红黑树具有自动排序的功能,因此set内所有的数据都是有序的。平衡性比较好,查找效率比较高。
  • 定义:set< type > name;
  • lower_bound(key)会查找第一个值不小于key的元素的迭代器
  • upper_bound(key)会查找第一个值大于key的元素的迭代器

3、unodered_map:C++中的一个STL,字典,由一系列键值对组成

  • 定义:unodered_map< type1,type2 > map_name
  • 插入元素:map_name.insert( make_pair(v1,v2) )
  • 删除某个键值对:map_name.erase(key)
  • 清空字典:map_name.clear()
  • 查找key对应的value:map_name.find(key)
  • 赋值:map_name[key] = value
    //找到则返回指向迭代器的类型pair,没有找到则返回结束迭代器end()

4、pair:将2个数据组合成一组数据

  • 头文件定义:#include< utility >
  • 创建和初始化:pair< type1,type2 > pair_name / pair_name(v1,v2)
  • 访问:通过first和sencond访问两个元素
  • 创建新的pair对象:make_pair(v1,v2)

5、auto

  • 定义:在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型
  • 注意:auto声明的变量必须要初始化
    auto的用法:https://blog.csdn.net/qq_31930499/article/details/79948906
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值