自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 Leecode刷题——栈和队列——逆波兰表达式求值(后缀表达式求值)

后缀表达式求值是非常典型的题目,这类题型一般使用二叉树的后序遍历来求解,本题使用栈的求解方式来解决例题:150.逆波兰表达式求值代码:class Solution { public int evalRPN(String[] tokens) { Deque<Integer> stack = new LinkedList<Integer>();/*使用deque接口来实现栈,Java中栈接口stack本身的语意不不能很好的表述栈的数据结构,使.

2022-05-15 11:22:48 264

原创 Leecode刷题——栈和队列——括号匹配(栈的应用)

计算机程序中有非常多的栈的应用,其中最典型的就是括号匹配,以此来更深入的了解一下栈的原理例题:20.有效的括号代码:class Solution { public boolean isValid(String s) { Stack<Character> stack = new Stack<>(); char ch; for(int i=0;i<s.length();i++){ ch

2022-05-15 10:36:36 360

转载 Leecode刷题——栈和队列——滑动窗口(单调队列)

栈和队列是重要的数据结构,应用在程序中很多底层结构中(比如栈是递归的底层实现),本次由队列来引出一个重要的数据结构(单调队列)。例题:239滑动窗口代码://解法一//自定义数组class MyQueue { Deque<Integer> deque = new LinkedList<>(); //弹出元素时,比较当前要弹出的数值是否等于队列出口的数值,如果相等则弹出(因为这样可以保证单调队列的逻辑) //同时判断队列当前是否为空 .

2022-05-11 11:09:31 155

原创 Leecode刷题——字符串——翻转字符串里的单词(翻转操作)

这次讲的题目比较利于锻炼解题的分步思维以及函数定义和调用例题:151(颠倒字符串中的单词)1.删除字符串中多余的空格:例如给你一个字符串(一个句子,不同单词之间由空格隔开),需要将字符串中多余的空格给去除。这样的操作实际上是整个题解的一个步骤,而这个步骤本身又可以分为三个步骤:(1)去除头部的空格。(2)去除尾部的多余空格。(3)去除中间部分的多余空格。代码如下:private StringBuilder removeSpace(String s){//定义双指针(字符串常规操作.

2022-04-23 00:06:32 375

原创 Leecode刷题——字符串——替换空格(填充问题)

字符串的操作相对来说不算难,本次的重点是字符串操作的填充问题例题:剑指Offer 05.替换空格1.填充问题的思路:很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。 这么做有两个好处: 不用申请新数组。 从后向前填充元素,避免了从前先后填充元素要来的 每次添加元素都要将添加元素之后的所有元素向后移动。 2.代码class Solution {public: string replaceSpace(string s) {

2022-04-22 15:16:30 530

原创 Leecode刷题——字符串——KMP算法

本文借助一道经典的字符串匹配的题目来复习KMP匹配算法。对于两个长度为n和m的字符串(文本串和模式串)的匹配,使用暴力解法的时间复杂度为O(m*n)而使用KMP算法的时间复杂度变为O(m+n)。例题:28(实现 strStr())1.KMP概述KMP算法的主要思想是在进行字符串的匹配出现不匹配的时候利用前面已经匹配过的一部分字符串来避免模式串的重头开始匹配。文本串:用于进行被匹配的串(一般是长串)模式串:用于匹配的串(一般是短串)2.前缀表(next数组存储)前缀表是记录

2022-04-21 09:22:37 606

原创 Leecode刷题——哈希表——两数之和(Map哈希表)

例题:1(两数之和)1.Map哈希表Java中map哈希表的创建如下:Map<Integer,Integer> maptable = new HashMap<>();给定一个键值对数据可以使用.put(key,value)函数向map哈希表中存储元素。 判断map哈希表是否包含某个键值对元素可以使用.containsKey(xxx)。与之前的set哈希表相比,map哈希更适用于不仅查找某个元素是否存在,而且可以获得对应这个元素的其他属性值(即通过键获得值)(可以

2022-04-13 22:17:02 281

原创 Leecode刷题——哈希表——两个数组的交集(Set哈希表)

例题:349(两个数组的交集)1.set哈希表Java中的set哈希表的创建方法如下:Set<Integer> set1 = new HashSet<>();给定一个数据可以使用.add()函数向哈希表中存储元素。判断哈希表是否包含某个元素可以使用.contains(key) 。与之前的数组哈希表相比,set哈希更适用于数据没有指定范围的题目,而且set哈希主要用于快速判断某个元素是否存在于哈希表中(可以理解为某个元素是否已存在 如判断某个学生是否在学校中)..

2022-04-13 10:54:18 629

原创 Leecode刷题——哈希表——有效的字母异位词(数组哈希表)

从这节开始便进入了哈希表的学习中,这两天有些焦虑和浮躁,平静心情后仍需要继续努力。哈希表是一种查找非常方便的数据结构,能够帮助我们快速的查找到对应值的数据元素,具体的介绍都总结在《哈希表总结》中,这里便不再赘述。这次的例题为:有效的字母异位词(题号242),题目如下:1.数组哈希表这道题我们可以用数组哈希表进行操作,数组哈希表就是一个数组,其关键码就是数组下标(针对这道题我们是通过字符的相减来得到对应数组的下标的,而数组中存储的值就是字母出现的次数)2.抵消思维本题还有一个值得注

2022-04-09 11:35:24 419

原创 哈希表总结

定义:哈希表是一种特殊的数据结构,它是可以根据关键码而直接进行访问对应值的数据结构,它有着非常高的查找、插入、删除效率。简单来说哈希表是一张键值对的映射表,给定一个关键码对哈希表通过哈希函数计算其关键码的索引(地址),这样就实现了根据键的直接访问。一般哈希表都是用来快速判断一个元素是否出现集合里。哈希表存储的是一个个键值对,即key,value,而键key也不一定是数字,怎么做下标? 这就要通过一个函数将其转为数字,也就是我们常说的哈希函数。常见的哈希函数:当我们想使用哈希法来解决问题的时候,我们一

2022-04-09 11:22:23 1001

原创 Leecode刷题——链表——环形链表(快慢指针)

本次总结的是链表中的环形链表,环形链表是链表的重难点之一,环形的结构有许多巧妙的地方,看看下面这道题环形链表II(相关题号:142)例142题目:1.快慢指针快慢指针是双指针法的一种经典用法,设立两个指针fast和slow,在遍历的过程中这两个指针的步幅不一样(例如本题中fast步幅为2,slow为1),这样的做法通常可以针对一些环形链表相遇问题(因为fast比slow快,有环的话是会再追上slow的)针对本题,fast步幅为2,slow为1这样再进入换之后fast一定会在某时和slow

2022-04-03 21:08:04 471

原创 Leecode刷题——链表——链表相交(双指针法、数学思维)

当我写本题的时候脑子里是有模拟法的思维的,但是当我看到Leecode的K神的双指针解法的时候瞬间感受到了一道算法题解程序可以多么简洁多么牛逼,话不多说,进入正题,这道题最大的意义在于双指针法的应用以及结合题目的数学思维模拟例02.07题目:1.结合数学思维的双指针法(共两种解法)(1)利用长度差设两个指针分别指向两个链表的头结点,对两个链表进行遍历得到他们的长度,长度差设为gap,将长的一个链表的指针往后走gap步。接着让两个指针同时往后走,比较两个指针所指节点是否相同若相同则可以判断是

2022-04-03 20:21:17 1009

原创 Leecode刷题——链表——删除倒数第N个节点(双指针法)

本次总结的问题是删除链表中的倒数节点,我们知道链表查找的时间复杂度是O(n)所以想要像数组那样实现常数时间内倒数第n个删除节点是比较困难的,这里需要借助双指针法来进行操作删除倒数第N个节点(题号19)例19题目:1.双指针设两个指针fast和slow,控制fast在slow后方,这样就可以实现链表不同位置的同时操作。针对本题,我们可以先让fast走n步,之后让slow和fast同时走,这样当fast走到链表末尾的时候slow便是倒数第n个节点(实际上让fast先走n+1步,因为这样sl.

2022-04-03 19:35:37 449

原创 Leecode刷题——链表——反转链表

链表的反转操作比较巧妙,学会后过两天依旧容易忘记,故做笔记来说明反转的过程本次总结的题目为链表的反转操作(题目序号为206、92、234)以206为例来详细说明,题目如下1.反转思维其实反转链表的抽象思维是比较容易想到的:从头结点开始从前往后让指针反转,为了不让链表断链需要使用双指针来进行操作,如下图:2.代码说明class Solution { public ListNode reverseList(ListNode head) { List...

2022-04-02 15:26:32 887

原创 Leecode刷题——链表——移除节点(虚拟头结点)

到了刷题的第二个板块了——链表操作。移除节点操作是非常基本也是非常重要的,链表中节点的移除要注意一定要遍历得到移除节点的前一个节点(比如说移除第i个节点就必须要有第i-1个节点的指针),因为链表查找的低效性,所以链表一些操作会相对数组来得更麻烦一点。本次总结的题目为链表的指定节点移除(题目序号为203)移除节点包括两种:给定值val移除;给定索引移除。给定索引移除相对比较简单,只需要去遍历到相应位置去操作就行而给定值移除稍微复杂一点,因为需要去进行值的比较。1.设立虚拟头结点帮助链表操作

2022-04-02 14:54:49 501

原创 Leecode刷题——数组——螺旋矩阵

来力扣刷题已经两周了,看了一眼自己的进度,还停留在数组链表,不免内心有点着急。但,总归是知道着急是没有用的,唯有更加努力,才能改变现状,故前言以此作为自我激励,相信自己可以变得更好。这次总结的是数组矩阵典型问题——螺旋矩阵(力扣题序为:54、59)1.先来理解一下螺旋矩阵长什么样:如下图显然螺旋矩阵的元素排列方式是螺旋式的,那么在解答之前有一个很重要的知识点需要归纳Java中的二维数组的定义和创建:int[][] res = new int[n][n]; //定义并初始化了一个二维数

2022-03-27 20:30:17 644

原创 LeetCode刷题——数组——滑动窗口

数组刷题来到了第一个坎:数组中滑动窗口的应用。说实话,我个人还是觉得滑动窗口像是双指针的进阶版本(滑动窗口也有两个指针,只不过抽象角度看指针被具象化为窗口的两个边界了)下面拿一个力扣上的经典例题来说明滑动窗口的应用题号:209:《长度最小的子数组》这道题的解题流程图和代码如下如下,其中双指针分别是start和end(ans表示临时记录的数组最小长度)先上代码:class Solution { public int minSubArrayLen(int target, int[]

2022-03-21 22:13:43 138

原创 LeetCode刷题——数组——移除元素

实话实说,刷题当中数组应该是最简单的一类题目,但是目前初期自己码题的时候大体思路是ok的,但是逻辑实现的细节和语法规范问题还是存在问题,话不多说,来看题:题号26、27

2022-03-18 11:24:21 5829

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除