[算法刷题打卡]Day2

本文介绍了LeetCode中的两道经典面试题目,涉及数组去重(使用双指针)和找出多数元素(利用哈希表)。通过实例分析了如何运用双指针优化删除有序数组中的重复项,以及如何使用unordered_map快速统计元素出现次数找到多数元素。
摘要由CSDN通过智能技术生成

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;
    }
};

用法总结

  1. unordered_set:

    • 存储唯一的键值(key),不允许重复元素。
    • 其中的每个元素都是独一无二的。
    • 使用哈希函数对元素进行排序,使得查找、插入和删除等操作的平均时间复杂度为常数时间 O(1)。
  2. unordered_map:

    • 存储键-值对(key-value pair),每个键都是唯一的,值可以重复。
    • 允许通过键快速查找对应的值。
    • 与unordered_set类似,使用哈希函数对键进行排序。
  3. unordered_multiset:

    • 存储的元素允许重复,但是它们之间不会建立键-值对的关系。
    • 可以存储相同值的多个实例。
    • 像unordered_set一样,但允许重复元素。
  4. unordered_multimap:

    • 允许键重复,每个键都可以对应多个值。
    • 与unordered_map类似,但键不是唯一的,可以对应多个值。

知识点总结:数组、哈希表


每日金句:无论你的人生路途有多么曲折,都要保持一颗坚韧不拔的心,因为终点的就在前方。

2024年3月20日

softdream


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值