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