数组理论基础

数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力

也就是说,想法很简单,但实现起来 可能就不是那么回事了。

首先要知道数组在内存中的存储方式,这样才能真正理解数组相关的面试题

「数组是存放在连续内存空间上的相同类型数据的集合。」

数组可以方便的通过下表索引的方式获取到下表下对应的数据。

举一个字符数组的例子,如图所示:

需要两点注意的是

  • 「数组下表都是从0开始的。」
  • 「数组内存空间的地址是连续的」

正是「因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。」

例如删除下表为3的元素,需要对下表为3的元素后面的所有元素都要做移动操作,如图所示:

而且大家如果使用C++的话,要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。

「数组的元素是不能删的,只能覆盖。」

那么二维数组直接上图,大家应该就知道怎么回事了

「那么二维数组在内存的空间地址是连续的么?」

我们来举一个例子,例如:int[][] rating = new int[3][4]; , 这个二维数据在内存空间可不是一个 3*4 的连续地址空间

看了下图,就应该明白了:

所以「二维数据在内存中不是 3*4 的连续地址空间,而是四条连续的地址空间组成!」

数组的经典题目

在面试中,数组是必考的基础数据结构。

其实数据的题目在思想上一般比较简单的,但是如果想高效,并不容易。

我们之前一共讲解了四道经典数组题目,每一道题目都代表一个类型,一种思想。

二分法

数组:每次遇到二分法,都是一看就会,一写就废

这道题目呢,考察的数据的基本操作,思路很简单,但是在通过率在简单题里并不高,不要轻敌。

可以使用暴力解法,通过这道题目,如果要求更优的算法,建议试一试用二分法,来解决这道题目

暴力解法时间复杂度:O(n)
二分法时间复杂度:O(logn)

在这道题目中我们讲到了「循环不变量原则」,只有在循环中坚持对区间的定义,才能清楚的把握循环中的各种细节。

「二分法是算法面试中的常考题,建议通过这道题目,锻炼自己手撕二分的能力」

双指针法

  • 数组:就移除个元素很难么?

双指针法(快慢指针法):「通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。」

暴力解法时间复杂度:O(n^2)
双指针时间复杂度:O(n)

这道题目迷惑了不少同学,纠结于数组中的元素为什么不能删除,主要是因为以下两点:

  • 数组在内存中是连续的地址空间,不能释放单一元素,如果要释放,就是全释放(程序运行结束,回收内存栈空间)。
  • C++中vector和array的区别一定要弄清楚,vector的底层实现是array,所以vector展现出友好的一些都是因为经过包装了。

双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组和链表操作的面试题,都使用双指针法。

滑动窗口

  • 数组:滑动窗口拯救了你

本题介绍了数组操作中的另一个重要思想:滑动窗口。

暴力解法时间复杂度:O(n^2)
滑动窗口时间复杂度:O(n)

本题中,主要要理解滑动窗口如何移动 窗口起始位置,达到动态更新窗口大小的,从而得出长度最小的符合条件的长度。

「滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)的暴力解法降为O(n)。」

如果没有接触过这一类的方法,很难想到类似的解题思路,滑动窗口方法还是很巧妙的。

模拟行为

  • 数组:这个循环可以转懵很多人!

模拟类的题目在数组中很常见,不涉及到什么算法,就是单纯的模拟,十分考察大家对代码的掌控能力。

在这道题目中,我们再一次介绍到了「循环不变量原则」,其实这也是写程序中的重要原则。

相信大家又遇到过这种情况:感觉题目的边界调节超多,一波接着一波的判断,找边界,踩了东墙补西墙,好不容易运行通过了,代码写的十分冗余,毫无章法,其实「真正解决题目的代码都是简洁的,或者有原则性的」,大家可以在这道题目中体会到这一点。

总结

从二分法到双指针,从滑动窗口到螺旋矩阵,相信如果大家真的认真做了「代码随想录」每日推荐的题目,定会有所收获。

推荐的题目即使大家之前做过了,再读一遍的文章,也会帮助你提炼出解题的精髓所在。

「如果感觉有所收获,希望大家多多支持,打卡转发,点赞在看 都是对我最大的鼓励!」

最后,大家周末愉快!

本文:

https://github.com/youngyangyang04/leetcode-master​github.com

已经收录,里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图,可以fork到自己仓库,有空看一看一定会有所收获,如果对你有帮助也给一个star支持一下吧!

我的B站(里面有我讲解的算法视频已经编程相关知识):

哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili​space.bilibili.com

我是程序员Carl,哈工大师兄,先后在腾讯和百度从事技术研发多年,利用工作之余重刷leetcode,更多精彩算法文章尽在:代码随想录,关注后,回复「Java」「C++」「python」「简历模板」等等,有我整理多年的学习资料,可以加我微信,备注「个人简介」+「组队刷题」,拉你进入刷题群(无任何广告,纯个人分享),每天一道经典题目分析,我选的每一道题目都不是孤立的,而是由浅入深一脉相承的,如果跟住节奏每篇连续着看,定会融会贯通。

二维数组删除_「leetcode」数组:总结篇!(一文搞懂数组题目)相关推荐

  1. 局域网arp攻击_「网络安全」常见攻击篇(23)——ARP攻击

    什么是ARP攻击? ARP攻击是利用ARP协议设计时缺乏安全验证漏洞来实现的,通过伪造ARP数据包来窃取合法用户的通信数据,造成影响网络传输速率和盗取用户隐私信息等严重危害. ARP攻击原理 ARP病 ...

  2. LeetCode刷题复盘笔记—一文搞懂0 - 1背包之494. 目标和问题(动态规划系列第九篇)

    今日主要总结一下动态规划0-1背包的一道题目,494. 目标和问题 题目:494. 目标和 Leetcode题目地址 题目描述: 给你一个整数数组 nums 和一个整数 target . 向数组中的每 ...

  3. LeetCode刷题复盘笔记—一文搞懂完全背包之322. 零钱兑换问题(动态规划系列第十四篇)

    今日主要总结一下动态规划完全背包的一道题目,322. 零钱兑换 题目:322. 零钱兑换 Leetcode题目地址 题目描述: 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amo ...

  4. 消除左递归实验代码_「leetcode」108. 构造二叉搜索树【递归】【迭代】详解!

    构造二叉搜索树,一不小心就平衡了 ❞ 108.将有序数组转换为二叉搜索树 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树 ...

  5. 消除左递归实验代码_「leetcode」669. 修剪二叉搜索树:【递归】【迭代】详解!

    单纯移除一个节点那还不够,要修剪! ❞ 669. 修剪二叉搜索树 题目链接:https://leetcode-cn.com/problems/trim-a-binary-search-tree/ 给定 ...

  6. 二维动画作品_「咻动画」二维动画制作中角色造型的设计要点

    关于二维动画可能就算不是动画行业的小伙伴们都多多少少都有所了解,近年来其在宣传片制作上面越来越受用.不少企业抛开传统保守的宣传片表现形式转而尝试动画制作宣传片,我们都知道在动画制作从脚本策划到输出成片 ...

  7. js实现kmp算法_「leetcode」459.重复的子字符串:KMP算法还能干这个!

    不瞒你说,重复子串问题,KMP很拿手 题目459.重复的子字符串 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: ...

  8. 消除左递归c++代码_「leetcode」129. 求根到叶子节点数字之和【递归中隐藏着回溯】详解...

    链接 https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/ 思路 本题和113.路径总和II是类似的思路,做完这道题,可以顺便把113. ...

  9. 内存淘汰算法_「承」Redis 原理篇——Redis 的内存回收机制

    前言 关于 Redis 的"起承转合",我前面已经用五个篇章的长度作了一个 Redis 基础篇--"起"篇的详细阐述,相信大家无论之前有没有接触过 Redis, ...

最新文章

  1. @ResponseBody
  2. Mybatis插入数据后获取主键的值
  3. android+静态密钥,Android - 更安全地保存静态密钥
  4. 再好的产品经理跑不过一半的A/B测试
  5. CAD国家制图员技术标准(OSTA)
  6. json yeid_如何控制Scrapy yield的顺序
  7. ffmpeg 安装教程
  8. 国内Android源码下载教程
  9. 照片格式怎么快速转JPG或JPEG格式
  10. 初中计算机表格知识点,初中信息技术考试知识点.doc
  11. android expandablelistview横向,expandableListView 总结
  12. 记录一下QT下载安装及相关说明
  13. Python批量合并处理B站视频
  14. 【魔店】拼多多店群玩法是什么?如何运营店铺?
  15. SlidesJS基本使用方法和官方文档解释 【Jquery幻灯片插件 Jquery相册插件】
  16. 笔记本换固态硬盘-华硕K555L
  17. 洛谷.P3374 树状数组
  18. 准备学python用什么电脑_001-小白学python-初入python世界
  19. 一般哪些原因会造成硬盘损坏呢
  20. 51单片机 c语言 汇编,51单片机之时钟(C语言和汇编两种方式实现)

热门文章

  1. Java对象容器——List
  2. 记一次Jquery获取值的典型错误
  3. linux中yum搭建与配置
  4. 都是大人物,看看你认识几个。
  5. 以太网供电新标准POE+,IEEE802.3at解析
  6. 使用WCF建立起Silverlight客户端与服务端的桥梁
  7. 小程序 国际化_在国际化您的应用程序时忘记的一件事
  8. c++运行不出结果_fastjson 不出网利用总结
  9. leetcode 690. 员工的重要性(dfs)
  10. github pages_如何使用GitHub Actions和Pages发布GitHub事件数据