【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组

这篇具有很好参考价值的文章主要介绍了【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组,剑指offer每日一练,c++,数据结构,算法,经验分享
🌈个人主页:聆风吟
🔥系列专栏:数据结构、剑指offer每日一练
🔖少年有梦不应止于心动,更要付诸行动。


一. ⛳️寻找文件副本(题目难度:简单)

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

1.1 题目

设备中存有 n 个文件,文件 id 记于数组 documents。若文件 id 相同,则定义为该文件存在副本。请返回任一存在副本的文件 id

1.2 示例

输入: documents = [2, 5, 3, 0, 5, 0]
输出: 0 或 5

1.3 限制

  • 0 ≤ documents[i] ≤ n-1
  • 2 <= n <= 100000

1.4 解题思路一

排序+遍历
对数组首先进行排序,然后遍历数组,如果documents[i] = documents[i+1],则返回doucuments[i]即可。
【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组,剑指offer每日一练,c++,数据结构,算法,经验分享

c++代码

class Solution {
public:
    int findRepeatDocument(vector<int>& documents) {
        
        //对数组进行排序 
        sort(documents.begin(),documents.end());

        //遍历查找,判断documents[i]是否等于documents[i+1]
        for(int i=0;i<documents.size()-1;i++)
        {
            if(documents[i]==documents[i+1]) return documents[i];
        }
        //如果不存在,返回-1
        return -1;

    }
};

1.5 解题思路二

哈希表
利用数据结构特点,容易想到使用哈希表记录数组的各个数字,当查找到重复数字则直接返回。

  1. 初始化: 新建 HashSet ,记为 map ;
  2. 遍历数组 documents 中的每个数字 doc:
    1. 如果doc在hmap中,说名重复,直接返回doc;
    2. 如果不在,将doc添加至hmap中;
  3. 如果不存在,返回-1。

【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组,剑指offer每日一练,c++,数据结构,算法,经验分享

c++代码

class Solution {
public:
    int findRepeatDocument(vector<int>& documents) {
        //新建 HashSet ,记为 map 
        unordered_map<int, bool> map;

        //遍历数组 documents 中的每个数字 doc
        // 1. 如果doc在hmap中,说名重复,直接返回doc;
	    // 2. 如果不在,将doc添加至hmap中;
        for(int doc : documents) {
            if(map[doc]) return doc;
            map[doc] = true;
        }

        //如果不存在,返回-1
        return -1;
    }
};


二. ⛳️螺旋遍历二维数组(题目难度:简单)

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

1.1 题目

给定一个二维数组 array,请返回「螺旋遍历」该数组的结果。

螺旋遍历: 从左上角开始,按照 向右向下向左向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元素。

1.2 示例

输入: array = [ [1, 2, 3], [8, 9, 4], [7, 6, 5] ]
输出: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

1.3 限制

  • 0 <= array.length <= 100
  • 0 <= array[i].length <= 100

1.4 解题思路

根据题目示例 array = [ [1, 2, 3], [8, 9, 4], [7, 6, 5] ],对应的输出为 [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ],可以发现,顺时针打印矩阵的顺序是 “从左向右从上向下从右向左从下向上” 循环。
【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组,剑指offer每日一练,c++,数据结构,算法,经验分享

解题过程:

  1. 判断 arr 是否为空值,如果为空直接返回 [ ] 即可;
  2. 初始化左边界,右边界,上边界,下边界分别为 lrtb,并创建容器 res 用于存储要打印的结果;
  3. 循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环打印;
    1. 将按顺序添加到 res
    2. 打印一行或一列,让边界收缩 1,代表已经打印
    3. 判断边界是否相遇,如果相遇则打印完毕,跳出循环。
  4. 返回 res

【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组,剑指offer每日一练,c++,数据结构,算法,经验分享

c++代码

class Solution {
public:
    vector<int> spiralArray(vector<vector<int>>& array) {
        if (array.empty()) return {};
        vector<int> res;
        int l = 0, r = array[0].size() - 1; 
        int t = 0, b = array.size() - 1;
        while(true)
        {
            //从左向右
            for(int i = l; i <= r; i++) res.push_back(array[t][i]);
            if(++t > b) break;
            //从上向下
            for(int i = t; i <= b; i++) res.push_back(array[i][r]);
            if(--r < l) break;
            //从右向左
            for(int i = r; i >= l; i--) res.push_back(array[b][i]);
            if(--b < t) break;
            //从下向上
            for(int i = b; i >= t; i--) res.push_back(array[i][l]);
            if(++l > r) break;
        }

        return res;
    }
};


📝结语

     今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,聆风吟的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的最大动力!
【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组,剑指offer每日一练,c++,数据结构,算法,经验分享文章来源地址https://www.toymoban.com/news/detail-755130.html

到了这里,关于【剑指offer|图解|数组】寻找文件副本 + 螺旋遍历二维数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【剑指offer】数据结构——数组

    【剑指offer】03.数组中重复的数字 //03. 数组中重复的数字 // 找出数组中重复的数字。 // 力扣 // 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。 // 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每 // 个数字重复了几次。请找出数组中任意一

    2024年02月08日
    浏览(31)
  • 剑指 Offer —— 数组和字符串

    在一个 n * m 的二维数组中: 每一行都按照从左到右 非递减 的顺序排序 每一列都按照从上到下 非递减 的顺序排序 请完成一个高效的函数,输入这样的一个 二维数组和一个整数 ,判断 数组中是否含有该整数 。 示例: 现有矩阵 matrix 如下: 给定 target = 5 ,返回 true 。 给定

    2023年04月24日
    浏览(34)
  • 【剑指 offer】旋转数组的最小数字

    ✨个人主页:bit me👇 ✨当前专栏:算法训练营👇 核心考点:数组理解,二分查找,临界条件 描述: 有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这

    2023年04月20日
    浏览(43)
  • 剑指 Offer 66. 构建乘积数组(中等)

    题目: 作者:Krahets 链接:https://leetcode.cn/problems/gou-jian-cheng-ji-shu-zu-lcof/solutions/208840/mian-shi-ti-66-gou-jian-cheng-ji-shu-zu-biao-ge-fe/ 来源:力扣(LeetCode)

    2024年02月10日
    浏览(26)
  • 【剑指offer】数组中重复的数字

    👑专栏内容:力扣刷题 ⛪个人主页:子夜的星的主页 💕座右铭:前路未远,步履不停 剑指offer:数组中重复的数字 在一个长度为 n 的数组里的所有数字都在 0 0 0 到 n − 1 n-1 n − 1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复,也不知道每个数字重复了几

    2024年01月20日
    浏览(35)
  • 剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)

    目录 1. 题目 2. 解题思路 3. 数据类型功能函数总结 4. java代码 5. 踩坑小记 递归调用,显示 StackOverflowError 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二

    2023年04月22日
    浏览(29)
  • 【剑指offer|图解|链表】链表的中间结点 + 链表中倒数第k个结点

    🌈个人主页: 聆风吟 🔥系列专栏: 数据结构、算法模板 🔖少年有梦不应止于心动,更要付诸行动。      💬 hello! 小伙伴们大家好哇,今天作者给大家带来的是链表的相关面试题的讲解,在学习了下文之后,相信大家可以更好的理解链表,并且我们同过本文的练习相

    2024年02月05日
    浏览(36)
  • 【剑指offer|1.数组中重复的数字】

    : 长度为n的数组nums中所有数字都在0~n-1范围内 返回任意一个重复的数字 总体时间复杂度和空间复杂度分析: 修改数组的方法: 因为有n个元素,每一个元素都在0~(n-1)范围内,如果元素不重复的话, 对数组重排之后,下标和元素值之间应该是一一对应的关系 但是因为

    2023年04月22日
    浏览(29)
  • 剑指offer03.数组中重复的数字

    看到这道题的第一眼想到的是先给它排序,然后双指针从左往右遍历,写了一个冒泡排序,但是我想到了应该会超时,因为冒泡时间复杂度是n的平方,输入大小时10000,肯定会超时,然后右又看了一下题目看到数字都是0-n-1,灵感一下子就来了,我先创建一个等大的自然数数

    2024年02月11日
    浏览(29)
  • 剑指offer练习日志01--数组小练习

    目录 ​ 一.剑指 Offer 03. 数组中重复的数字(原地哈希思想) 问题描述: 问题分析: 原地哈希思想排序: 题解算法gif:  算法接口: 二.二维数组中的查找(😍行列交叉二分法😍) 问题描述: 方法一:🤔对角元素比较搜索法🤔 算法思想: 算法gif:  算法接口实现: 方法二.😍行列交叉二

    2023年04月24日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包