IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【05-08】力扣每日一题 -> 正文阅读

[数据结构与算法]【05-08】力扣每日一题

今天是母亲节,祝全天下的母亲节日快乐。
本文首发于馆主君晓的博客,05-08

题目内容

??442. 数组中重复的数据,题目截图如下:

image-20220508112559546

题目分析

??这个题目第一眼一般就能够想到使用哈希表来做,还是老步骤。我们先来转述下题目的意思,题目是说,给你一个长度为n的整数数组,并且数组里的所有整数都在范围[1,n]之间,并且每个整数要么出现一次,要么出现两次,然后你需要找出出现两次的数字,并且将其返回。

??思路一,使用c++unordered_map,我们只需要使用一次循环,循环遍历数组,将数组的元素作为key放在map里,如果key已经存在了那么久将其放入结果数组中,循环结束,我们的元素也就找出来了。

class Solution {
private:
    unordered_map<int,int> map;
public:
    vector<int> findDuplicates(vector<int>& nums) {
        int n = nums.size();
        vector<int> res;
        for(int i = 0;i<n;i++){
            if(map.find(nums[i])!=map.end()){
                map[nums[i]]+=1;
                res.push_back(nums[i]);
            }else{
                map[nums[i]] = 1;
            }
        }
        return res;
    }
};

image-20220508113614540

??但是上面的思路耗时太久,我们可以尝试第二种思路,首先排序然后使用双指针,按照升序的方式进行排序,之后一前一后指针,如果两个指针所指的元素相等,那么就将元素放入结果数组。

class Solution {
public:
    vector<int> findDuplicates(vector<int>& nums) {
        // 排序+双指针
        vector<int> res;
        int n = nums.size();
        if(n==1){
            return res;
        }
        sort(nums.begin(),nums.end());
        int back = 0,front = 1;
        while(front<n){
            if(nums[back]==nums[front]){
                res.push_back(nums[back]);
            }
            back++;
            front++;
        }
        return res;
    }
};

image-20220508160524515

??上面的思路的确可以,但是其实不符合题目要求,题目要求时间复杂度为o(n),空间复杂度为常数。于是就有了下面的第三种方式,原地哈希。直接看代码可能比较好懂:

class Solution {
public:
    vector<int> findDuplicates(vector<int>& nums) {
        // 原地数组
        vector<int> res;
        int n = nums.size();
        if(n==1){
            // 特殊处理
            return res;
        }
        for(int i = 0;i<n;i++){
            // 获取nums[i]的绝对值 因为可能为负数 负数是因为我们取反了
            int x = abs(nums[i]);
            if(nums[x-1]>0){
                // 下标所处位置的元素大于0 说明还没被取负 取负的都是我们第一次碰见的数
                nums[x-1] =-nums[x-1];
            }else{
                // 已经取负了 所以现在这次相当于第二次碰见这个数 那么就加入结果数组
                res.push_back(x);
            }
        }
        return res;
    }
};

image-20220508161409158

代码实现

??代码实现如上所示。

结语

??父母在,不远游,游必有方。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:59:06  更:2022-05-09 13:02:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:27:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码