力扣刷题1

本文详细介绍了数据结构中的数组、二分查找及其应用,强调了边界处理和防止溢出的重要性。讨论了链表的基础理论,包括单链表、双链表、循环链表以及各种链表操作,如反转和两两交换节点。同时,提到了哈希表在字符串处理和数组操作中的高效应用,探讨了哈希碰撞的解决方法,并分析了哈希表和数组、set在不同场景下的优缺点。此外,还涵盖了字符串处理、有序数组的平方、最小覆盖子串等算法问题的解法。
摘要由CSDN通过智能技术生成

数组

数组的存放 int[][] array={{}{}} 存放地址

二分查找

元素是否唯一,不唯一则无法二分查找

  1. 取中值时要避免数据溢出,middle = left + (right - left)/2
  2. 一定要注意边界的处理
  3. 有关大于小于号判断,一定要找最贴切的一个符号。
  4. C++ int long 各种符号类型 重新复习;不同数据类型数学运算有啥结果

多次二分查找该如何使用:一定要读懂题目意思,找两个边界该用什么样的方法

移除元素(双指针法)

  1. 要先确定判断条件对应的状态以及特殊情况会产生的影响。
  2. 从前向后判断,还是从后向前判断。(884 比较含退格的字符串)

有序数组的平方

  1. 双指针
  2. 各种排序算法还未学习

长度最小的子数组

  1. 暴力解法
    两个for循环
  2. 滑动窗口
    结合hash表求解,76题未做(不懂hash表)

最小覆盖子串

螺旋数组

遵循同一个原则,避免漏掉

链表

基础理论

通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域,最后一个节点的指针域指向null。

单链表

单向指针

双链表

双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。

循环链表

链表首尾相连,可以用来解决约瑟夫环问题。
链表节点定义

struct ListNode{
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(NULL){} //节点的构造函数
	};
	//自定义初始化节点
	ListNode* head = new ListNode(5);
	//默认初始化节点
	ListNode* head = new ListNode();
	head->val = 5;
	// delete list node
	// 从内存中删除移除的节点,清理内存
	//设置虚拟头结点,或直接从原list移除
	// add list node

反转链表

1.(双指针法)
使用空间保存原始下一个指针
2. 递归法:定义一个递归函数,调换两者指针,指导一个指针为空停止递归

两两交换链表节点

双指针
先得到距离为n的两指针
再定位最末端与待删除的前一个节点。

链表相交

使链表末端对齐,即将长链表指针移至短链表头部;
依次判断两节点是否相等(节点,非数值

环形链表

  1. 利用哈希表遍历所有节点
  2. 双指针,快指针 慢指针;从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。

哈希表

哈希表是根据关键码的值而直接进行访问的数据结构。
一般哈希表都是用来快速判断一个元素是否出现集合里。使用哈希表的话, 只需要O(1)就可以做到。

哈希函数、哈希编码、哈希碰撞
哈希碰撞有两种解决方法, 拉链法和线性探测法

哈希碰撞

解决哈希编码后的数值大于哈希表大小问题

  1. 拉链法 将数据存在链表中
  2. 线性探测法

常见的三种哈希结构

哈希表总结

  • 数组
  • set (集合) :set;multiset;unordered_set(哈希表)
  • map(映射):map是一种key value的存储结构,可以用key保存数值,用value在保存数值所在的下标。
    std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。
  1. 如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费
  2. set是一个集合,里面放的元素只能是一个key

字符串处理用数组vector

题1:有效字母异位词\赎金信(普通哈希)

数组处理(哈希值比较少),用set,map

题2:字母异位词分组(将每个字母出现的次数使用字符串表示,作为哈希表的键)unordered_map
题3:快乐数 unordered_set

哈希表的find搜索速度比for循环快很多,但占内存。

使用数组和set来做哈希法的局限

1. 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
2. set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。

三数之和、四数之和、N数之和:双指针法,注意去重
均是: for 循环、剪枝、去重、再指针

好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问的关键。需要仔细分析目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值