1、Leetcode-面试经典150题目4-80. 删除有序数组中的重复项 II
思路
1.这道题与昨天做的类似,依然可以使用双指针的思路
2.这道题没有做出来,只过了一个用例,我的想法是p、q两个指针,并且有一个c用于计数,对于c大于2的情况处理,但是在处理函数这部分比较复杂,一直出现问题
3.看完题解之后,同样使用双指针(slow 慢指针,fast快指针),首先对于少于等于2个元素的数组可以直接返回,不需要做处理。(对于特殊情况的处理),之后,对于nums[slow-2] == nums[fast]这种情况,即说明超过2个重复元素,不应该被保留,
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
//首先对于 <= 2情况进行处理
if(nums.size() <= 2)return nums.size();
//定义快慢双指针
int slow = 2, fast = 2;
while(fast < nums.size()){
if(nums[slow-2] != nums[fast]){
nums[slow] = nums[fast];
slow ++;
}fast ++;
}
return slow;
}
};
知识点总结:数组、双指针
2、Leetcode-面试经典150题目5-169. 多数元素
思路
1.结果要求返回一个多数元素(即出现次数最多的),因为已经>n/2,所以一定是最多的
3.使用HashMap来存储每个元素及出现次数,最后返回出现最多的值。(unordered_map)一个关联容器,内部采用的是hash表结构,拥有快速检索的功能。
class Solution {
public:
int majorityElement(vector<int>& nums) {
unordered_map<int,int> counts;//哈希表
int max=0,cnt=0;
for(int i = 0;i<nums.size();i ++){
counts[nums[i]]++;//统计重复次数
if(counts[nums[i]]> cnt){
max = nums[i];//结果max返回的是元素值,而不是元素出现的次数
cnt = counts[nums[i]];//将当前最大次数赋值给cnt
}
}
return max;
}
};
用法总结
unordered_set:
- 存储唯一的键值(key),不允许重复元素。
- 其中的每个元素都是独一无二的。
- 使用哈希函数对元素进行排序,使得查找、插入和删除等操作的平均时间复杂度为常数时间 O(1)。
unordered_map:
- 存储键-值对(key-value pair),每个键都是唯一的,值可以重复。
- 允许通过键快速查找对应的值。
- 与unordered_set类似,使用哈希函数对键进行排序。
unordered_multiset:
- 存储的元素允许重复,但是它们之间不会建立键-值对的关系。
- 可以存储相同值的多个实例。
- 像unordered_set一样,但允许重复元素。
unordered_multimap:
- 允许键重复,每个键都可以对应多个值。
- 与unordered_map类似,但键不是唯一的,可以对应多个值。
知识点总结:数组、哈希表
每日金句:无论你的人生路途有多么曲折,都要保持一颗坚韧不拔的心,因为终点的就在前方。
2024年3月20日
softdream