力扣刷题心得_JAVA

发布于:2025-02-10 ⋅ 阅读:(47) ⋅ 点赞:(0)

数学 > 数组 > 链表 > 字符串 > 哈希表 > 双指针 > 递归 > 栈 > 队列 > 树
//一般力扣中传入的参数和新建的对象作为返回值,都不列入空间复杂度中
//但是面试的时候要和面试官商量好,灵活定义空间复杂度
//当然最好是就在传入的对象作为返回值,(在原对象上改,没这种方法就没办法了)
2字节是65535

数组

方法API

数组API

java.util.Arrays包
Arrays.toString(arr);转为字符串
Arrays.binarySearch();二分查找
Array.copyOf();拷贝数组
Array.copyOfRange();拷贝数组(指定范围)
Arrays.fill();填充数组
Arrays.sort();排序,默认升序

针对int或integer

java.lang.Math包
Math.abs() //获取绝对值
Math.pow(a,b)//获取平方值a为值,b为幂次

链表

关于栈\队列\链表首尾关系

Deque提供的重要的API
add
addAll
offer
poll
peek
push
pop
size

以LinkedList为例,[1,2,3,4,5]左边为表首,右边为表尾
入栈出栈左边入出
入队列右边进,出队列左边出
不重要的API
addFirst
addLast
offerFirst
offerLast
removeFirst
removeLast
pollFirst
pollLast
getFirst
getLast
peekFirst
peekLast

字符串

StringBuilder

提供的API
StringBuilder sb = new StringBuilder();
sb.charAt();
sb,setCharAt();
sb.deleteCharAt();

KMP模式匹配算法

一个人能能走的多快不在于他在顺境时能走多少步,而在于他在逆境时多久能找到曾经的自己。–KMP

步骤:

  1. 计算匹配串的next数组
  2. 根据next数组匹配主串和匹配串
  • 关键点,好马不吃回头草,磨刀不误砍柴功
  • 匹配串建立代表各位置情况的next数组

主串和匹配串的匹配能跳步,主要也是根据匹配串的子串前缀和后缀匹配特性处理的
总而言之.KMP算法就是不断保存和利用先验知识减少时间复杂度的算法

next数组的计算

next数组的计算就是匹配串的子串前缀和后缀匹配计算的过程(但并不是暴力计算,也是有技巧的)
next数组的优化步骤计算也是用到了之前子串前缀和后缀匹配的信息
关键思想:匹配串的前后缀匹不匹配,如果不匹配,后缀匹配的前缀的前后缀匹不匹配,依次类推…,如果字符串极长,这就是个迭代的过程了

哈希表

HashMap

Map<Integer,Integer> hashMap = new HashMap<>();
hashMap.put(key,value);//放入键值对
hashMap.get(key);//根据键获取值
hashMap.containsKey(key);//包不包含key
hashMap.containsValue(value);//包不包含value
hashMap.getOrDefault(key,0);//如何哈希中存在这个键,返回对应值,没有返回默认值

hashMap.entrySet()之后变为键值对对象才能增强for遍历
for(Entry<Integer,Integer> entrySet : hashMap.entrySet()){}

双指针

递归

如果一个串或者线性表中要有一对数据要匹配或删除,用栈就很方便

队列

广度优先搜索(BFS)和深度优先搜索(DFS)

  • 像树前中后序遍历都是深度优先搜索
    深度优先搜索一般结合作为工具
    二叉树的前中后序遍历可以用迭代遍历\递归遍历\统一迭代法遍历
    无论是迭代遍历还是递归遍历都是用的栈的思想
    迭代遍历使用的栈存数据
    递归遍历使用的栈运行程序,每调用一次递归函数就入栈一个栈帧
    可以说递归就是在逻辑和在jvm虚拟机层面上用的栈
  • 层序遍历是广度优先搜索
    广度优先搜索一般结合队列实现
    用链表也可以,但是逻辑上太麻烦了,而队列就是以链表为基础,特殊的链表,实现特殊的功能,有队列为什么不用呢

网站公告

今日签到

点亮在社区的每一天
去签到