数组、链表、哈希表(数据结构)-代码随想录

数组

地址连续;数组的元素不能删除、只能覆盖!

在排序数组中,常用到 二分查找的方法;

移除元素时需要覆盖掉原来的元素;

使用双指针进行问题的解决(有序数组的平方、长度最小的子数组)滑动窗口

数组中数学逻辑的模拟很重要(螺旋数组Ⅱ);

注意一个重要的 概念:循环不变量;注意左闭右闭和左闭右开的情况,来设定循环时的判定条件,注意将所有的情况都包含进来!

链表:

链表中最重要的就是 虚拟头节点(哨兵节点),对头节点的处理很方便,解决了头节点相对于其他节点的特殊性;

设置一个 前置节点pre,进行之前节点的记录很重要;在反转链表中使用到;

链表中的双指针使用:!

重要的点:指针所走的步数 之和,可以作为双指针重要的判断指标;

删除链表中倒数第N个节点:快慢指针,快指针先走 N步,然后快慢指针同时走!

链表相交先在自己的链表中走,走完去另一个链表中寻找,将节点相等作为判定条件!注意可以拿到 null,作为终止循环的条件!

环形链表Ⅱ:使用快慢指针,快指针每次走两步,慢指针每次走一步,有环肯定会相遇;无环肯定不会相遇!相遇后再判断数学关系!

链表中的 节点相等 可以作为一个重要的判断条件!环一定在链表尾部!

哈希表:

数组、Set、Map三种哈希表结构:用索引确定位置,查找的时间复杂度都是 O(1)

数组:在哈希表的长度确定时,比如 全是小写字母,就是26;可以使用!

Set(集合):不会出现重复的元素,可以去重

Map(映射):键值对 Key-Value的形式存储,不会出现一样的键值对!

数组作为哈希表:遇到判断字符串相等与否的情况,就是用26长度的数组作为哈希表;统计字符串中字符的数量,进行比较!有效的字母易位词、赎金信

使用Set:两个数组的交集,只记录数值!快乐数!需要进行一个数字每个位置上的值的 四则运算

while (n > 0) {
            int temp = n % 10;
            res += temp * temp;
            n = n / 10;
}

使用Map:两数之和(需要记录下标);三数之和、四数之和(需要使用双指针降低时间复杂度)!三个和的问题,都是在同一个数组中!

四数相加:用的四个数组,只用折半,将四次方的时间复杂度变为二次方!要使用Map,记录出现的次数!

遍历枚举中,下一层只需要从上一层 i 的 i +  1处开始即可,就已经包含了所有的情况!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
声明:使用这些类是使用者的自愿行为,作者对源代码的质量不提供任何形式的担保,如果使用者因使用这些类而造成的任何损失都与作者无关,作者不承担任何责任。<br><br>/*************** 这些头文件不必包含 ***************/<br>node.h: 普通链表结点<br>dnode.h: 双向循环链表结点<br>treenode.h: 二叉树结点<br>avltreenode.h: AVL 树结点<br>/**************************************************/<br><br>array.h: 安全数组,可自动增长大小(随机访问,但扩充时效率低)<br>linkedlist.h: 普通链表(可随机访问,但访问效率低)<br>dclinkedlist: 双向循环链表(不可随机访问,但插入、遍历的效率都比普通链表高)<br>hashtable.h: 哈希表(使用键值标识元素,键值一样的元素即认为相等,需重载 == 运算符并由用户定义哈希函数)<br>binstree.h: 二叉搜索树(需重载 == 和 < 运算符)<br>avltree.h: AVL 树(需重载 == 和 < 运算符)<br><br>如果要存储集合(元素不可重复)并快速查找,最佳的是 binstree.h(二叉搜索树)。<br>如果要存储二维或更高维的表格,最佳的是 hashtable.h(哈系表)。<br><br>AVL 树的插入成本非常高(删除函数也没有实现),但 AVL 的搜索效率极高,所以适用于在程序开始前初始化程序中经常要用到的集合,一般应用二叉搜索树已经足够了。<br><br>以上代码都是作者照书上改写的,并未经过严格测试,如果使用过程中发现任何问题、源代码错误或可改进的地方,非常欢迎来信与我讨论。电子邮件地址:pro_zw@lol35.com<br><br>作者会根据各位所发现的问题不断改进各类并增加新的数据结构,使其更加完善。<br><br>参考书目:<br>《数据结构-C++ 语言描述》 William Ford William Topp 著 清华大学出版社<br>《计算机程序设计艺术》 DONALD E.KNUTH 著 清华大学出版社<br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值