自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LeetCode376—摆动序列(java版)

题目描述:标签:贪心算法 动态规划如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如,[1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3)是正负交替出现的。相反, [1,4,7,2,5]和[1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长...

2021-03-31 21:08:42 154

原创 LeetCode455—分发饼干(java版)

题目描述:标签:贪心算法假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j]。如果 s[j]>= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。代码:思路分析:贪心算法的思想是指在对问题进行求解时,在每一步都选择最优的选择,从而实现结果...

2021-03-31 20:48:13 386

原创 LeetCode459—重复的字符串(java版)

题目描述:标签:字符串给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。代码:思路分析:部分匹配值表求解思路同strStr()题的思路。这题主要是把语言表达转换为数学思路。当next[len-1]!=0且len % (len - next[len-1])==0时说明能够有子串重复多次构成,这是由部分匹配值表的性质决定的!其余情况下返回false。class Solution { publi.

2021-03-31 20:18:47 156

原创 LeetCode28—实现strStr()(java版)

题目描述:标签:字符串 双指针实现strStr()函数。给定一个haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回-1。代码:思路分析:这里采用了kmp算法来解决这道问题。(顺便复习了一下这个算法的全过程)1、首先要定义一个方法kmpNext(子字符串),获取子字符串的部分匹配值表。①首先定义一个next[子字符串长度]数组,保存各个位置的部分匹配值...

2021-03-31 20:04:13 250

原创 剑指 Offer 58-Ⅱ—左旋转字符串(JAVA版)

题目描述:标签:字符串字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。代码:思路分析:emmm,直接用了substring()方法取前面和后面两串字符串,然后进行拼接。class Solution { public String reverseLeftWords(String s, int n) { .

2021-03-30 18:25:45 89

原创 LeetCode151—翻转字符串里的单词(java版)

题目描述:标签:字符串给定一个字符串,逐个翻转字符串中的每个单词。说明:1、无空格字符构成一个 单词 。2、输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。3、如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。代码:思路分析:这里利用api特性的方法,来熟悉字符串相关的方法。1、trim()函数:去除字符串前后两端的空格。2、Arrays.asList():将数组作为列表。3、split():以某种规则分隔字符串,这...

2021-03-30 18:17:28 323

原创 剑指 Offer 05—替换空格(JAVA版)

题目描述:请实现一个函数,把字符串s中的每个空格替换成"%20"。代码:思路分析:1、建立一个StringBuffer对象,利用它的append()方法。2、对字符串进行遍历操作,碰到非空格字符就直接添加,碰到空格字符就添加“%20”。class Solution { public String replaceSpace(String s) { StringBuffer sb = new StringBuffer(""); fo...

2021-03-30 17:08:35 98

原创 LeetCode541—反转字符串Ⅱ(java版)

题目描述:标签:字符串给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔2k 个字符的前 k 个字符进行反转。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。代码:思路分析:同反转字符串。1、反转模块思路是有的。重要的是确定反转部分的开始端+结束端。2、start从0开始,2*k为长度,进行循环。每次循环中反转字符串的开始端i=start,结束端j=min(star...

2021-03-29 19:24:42 137

原创 LeetCode344—反转字符串(java版)

题目描述:标签:双指针 字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。代码:思路分析:1、定义双指针left,right;左指针left指向字符数组首端,右指针right指向字符数组尾端;2、进行循环,将每一对left和right位置上的元素进行交换,交...

2021-03-29 18:50:39 170

原创 LeetCode18—四数之和(java版)

题目描述:标签:数组 哈希表 双指针给定一个包含n 个整数的数组nums和一个目标值target,判断nums中是否存在四个元素 a,b,c和 d,使得a + b + c + d的值与target相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。代码:思路分析:思路同三数之和 不过需要注意以下几点:1、一定一定要记得给数组元素先排序啊~2、仍旧使用双指针解决这个问题,不过就是在三数之和的基础上再加一层外...

2021-03-27 22:22:35 286

原创 LeetCode383—赎金信(java版)

题目描述:标签:字符串给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)代码:思路分析:思路同有效字母的异位词class Solution { publi...

2021-03-27 21:52:20 122

原创 LeetCode454—四数相加Ⅱ(java版)

题目描述:标签:哈希表 二分查找给定四个包含整数的数组列表A , B , C , D ,计算有多少个元组 (i, j, k, l),使得A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过231 - 1 。代码:思路分析:1、定义一个map,key存放A[I]+B[j]的和,value存放和出...

2021-03-26 19:31:55 118

原创 LeetCode202—快乐数(java版)

题目描述:标签:哈希表 数字编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为1,那么这个数就是快乐数。如果 n 是快乐数就返回 true ;不是,则返回 false 。代码:思路分析:1、这里要注意的真假判断条件——无限循环意味着相加又出现之前的和,就会在一个圈里无限循环2、所以我们需要一个se...

2021-03-26 19:12:02 224

原创 LeetCode349—两个数组的交集(java版)

题目描述:标签:排序 哈希表 双指针 二分查找给定两个数组,编写一个函数来计算它们的交集。代码:思路分析:1、定义一个set1来存第一个数组nums1的去重后的元素;定义一个set2来存第二个数组包含在set1中的元素,这样变得到了交集set22、定义int[ ] arr来存放结果,长度为set2.size()。也可以用增强for循环遍历set2class Solution { public int[] intersection(int[] num...

2021-03-26 18:53:35 143

原创 LeetCode242—有效的字母异位词(java版)

题目描述:标签:排序 哈希表给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。代码:思路分析:《方法一:排序》1、首先判断字符串的长度是否相等,不等肯定不是异位词;2、然后利用toCharArray()方法将字符串转为字符数组;利用Arrays.sort()对字符数组进行排序;3、最后对两个排序后的字符数组Arrays.equals(s1,s2)进行比较。《方法二:哈希表》1、利用一个长度为26的数组来存储s字符串中26个字...

2021-03-25 23:49:19 167

原创 LeetCode257—二叉树的所有路径(java版)

题目描述:标签:树 深度优先搜索给定一个二叉树,返回所有从根节点到叶子节点的路径。说明:叶子节点是指没有子节点的节点。代码:思路分析:采用深度优先搜索(也就是遍历)前序遍历判断是否添加到list中有:①如果是叶子结点,则把路径添加到list中②如果非叶子结点,则继续查找左子结点和右子结点路径注意:这里定义了一个StringBuffer类,append()方法是添加元素。StringBuffer => String :StringBuffer.t...

2021-03-25 20:41:18 196

原创 LeetCode222—完全二叉树的节点个数(java版)

题目描述:标签:树 二分查找给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~2h个节点。代码:思路分析:(这道题如果直接用递归,真的很简单,真的是年轻人不讲武德,不过就没有使用到完全二叉树的性质)1、利用完全二叉树的性质,一直往左子树查找,直到找到叶子结点,则为该数的层...

2021-03-25 20:22:22 316

原创 LeetCode110—平衡二叉树(java版)

题目描述:标签:树 深度优先搜索 递归给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1 。代码:思路分析:思路其实同二叉树的最大深度。1、递归结束的条件是,当根节点为null时,返回0。2、求左子树高度和右子树高度,这里需要处理的是两种情况:①如果左子树或右子树有不平衡,则会返回-1②如果左子树和右子树平衡,则会返回左子树和右子树中较大的高度+1/** *...

2021-03-25 19:39:33 78

原创 LeetCode559—N叉树的最大深度(java版)

题目描述:标签:树 深度优先搜索 广度优先搜索给定一个 N 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。代码:思路分析:思路同二叉树的最大深度。不过添加子结点进入队列使用的是增强for循环。《方法一:广度优先搜索(其实也就是层序遍历)》/*// Definition for a Node.class Node { public int val...

2021-03-24 21:17:07 99

原创 LeetCode590—N叉树的后序遍历(java版)

题目描述:标签:树给定一个 N 叉树,返回其节点值的后序遍历。N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值null分隔(请参见示例)。代码:思路分析:思路同二叉树的后序遍历。不过就是递归的时候使用增强for循环遍历每一个子结点对他们进行后序递归。/*// Definition for a Node.class Node { public int val; public List<Node> children...

2021-03-24 20:55:00 101

原创 LeetCode226—翻转二叉树(java版)

题目描述:标签:树翻转一棵二叉树。代码:思路分析:1、如果形象地看一颗二叉树,要翻转它,首先想到的是 (左子树.右子结点 和 右子树.左子结点)或 (右子树.左子结点 和 左子树.右子结点) 交换, 但其实这样交换很麻烦,需要动的一个脑筋就是根节点其实也会交换,所以问题就等价于对每一个根节点只需要左子结点和右子结点交换即可!2、采用递归的做法,递归结束的条件是判断根节点是否为null。/** * Definition for a binary t...

2021-03-24 20:46:40 277 1

原创 LeetCode589—N叉树的前序遍历(java版)

题目描述:标签:树给定一个 N 叉树,返回其节点值的前序遍历。N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值null分隔(请参见示例)。代码:思路分析:思路同二叉树的前序遍历。不过就是递归的时候使用增强for循环遍历每一个子结点对他们进行前序递归。《方法一:递归解法》/*// Definition for a Node.class Node { public int val; public List<Node&...

2021-03-23 21:16:25 133

原创 LeetCode637—二叉树的层平均值(java版)

题目描述:标签:树给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。代码:思路分析:思路同二叉树的层序遍历。只不过需要每层对所有节点的值求和,然后每层遍历结束后将该层的平均值加入链表。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNo..

2021-03-23 20:50:11 164

原创 LeetCode199—二叉树的右视图(java版)

题目描述:标签:树 深度优先搜索 广度优先搜索 递归 队列给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。代码:思路分析:思路分析同二叉树的层序遍历。改进的地方在于每层遍历时只保留最后一个节点的值加入链表中。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * ...

2021-03-23 20:35:05 195

原创 LeetCode107—二叉树的层序遍历Ⅱ(java版)

题目描述:标签:树 广度优先搜索给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)代码:思路分析:思路同二叉树的层序遍历,不过需要使用list的头插方法list.add(0,res),即在索引为0的位置插入元素,即头插。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode..

2021-03-22 20:50:46 78

原创 LeetCode102—二叉树的层序遍历 (java版)

题目描述:标签:树 广度优先搜索给你一个二叉树,请你返回其按层序遍历得到的节点值。 (即逐层地,从左到右访问所有节点)。代码:思路分析:1、首先最重要的是使用队列+广度优先搜索来实现层序遍历操作。2、把根节点加入队列,对应此时的层数。以此时队列的长度为循环终止条件开始循环:取队列节点的值加入当层的list,并把该节点的左右节点加入队列。其实每层即对应一次大循环此时队列里的节点个数。/** * Definition for a binary tree node...

2021-03-22 20:32:36 234

原创 LeetCode145—二叉树的后序遍历(java版)

题目描述:标签:栈 树给定一个二叉树,返回它的后序遍历。代码:思路分析:后序遍历是左子树-右子树-根。思路同二叉树的中序遍历。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int va...

2021-03-21 19:51:26 146

原创 LeetCode144—二叉树的前序遍历(java版)

题目描述:标签:栈 树给你二叉树的根节点root,返回它节点值的前序遍历。代码:思路分析:前序遍历是根-左子树-右子树。思路同二叉树的中序遍历/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeN...

2021-03-21 19:45:57 134 3

原创 LeetCode94—二叉树的中序遍历(java版)

题目描述:标签:栈 树 哈希表给定一个二叉树的根节点root,返回它的中序遍历。代码:思路分析:1、这和自己学数据结构与算法的时候不一样的点就是题目需要返回一个list。所以这里传参需要传入链表list。2、单独写中序遍历的方法。递归结束的判断是遇到null。若不是,则先遍历左子树-根-右子树。/** * Definition for a binary tree node. * public class TreeNode { * int ...

2021-03-21 19:39:35 174

原创 LeetCode111—二叉树的最小深度(java版)

题目描述:标签:树 深度优先搜索 广度优先搜索给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。代码:思路分析:1、想法和求二叉树的最大深度一样。即找到左子树高度leftHeight 和 右子树高度rightHeight ,取两者最小值 + 1即为最小深度。2、但有两种特殊情况需要处理,那就是一棵树只有左子树或者右子树的情况,此时leftHeight或者rightHeight=0,如果取最...

2021-03-16 21:43:06 149

原创 LeetCode104—二叉树的最大深度(java版)

题目描述:标签:树 深度优先搜索 递归给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。代码:思路分析:1、其实就是需要找到左子树的高度leftHeight 和 右子树的高度rightHeight ,然后取两个高度的最大值 + 1即为二叉树的最大深度2、利用递归,递归结束的条件就是null。返回0。/** * Definition for a binary tree node....

2021-03-16 21:13:54 162

原创 LeetCode101—对称二叉树(java版)

题目描述:标签:树 深度优先搜索 广度优先搜索给定一个二叉树,检查它是否是镜像对称的。代码:思路分析:1、想到了定义两个指针p、q,同时从根节点往左子树(p) 和 右子树移动(q) ,要想镜像对称,应该要满足p的左子树值=q的右子树值。2、这里因为用的是递归的解法,所以要注意的是递归结束的条件。 ①如果p和q都为null,说明两者在该位置是对称的,返回true ②如果p和q有一个为null一个有值,说明两者在该位置是不对称的,返回false3、...

2021-03-14 20:00:38 217

原创 LeetCode1047—删除字符串中的所有相邻重复项(java版)

题目描述:标签:栈给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。代码:思路分析:想到用栈解决,每个元素压入前都与栈顶的元素比较,如果相同就可以消除。但这里不是直接造一个栈对象,是用stringbuffer stack实现了栈,定义一个指向栈顶的指针top。获取栈顶的元素用的是stack.charAt(top)删除...

2021-03-11 21:24:31 209

原创 LeetCode232—用栈实现队列(java版)

题目描述:标签:栈 设计请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你只能使用标准的栈操作 —— 也就是只有push to top,pee...

2021-03-11 21:01:10 247

原创 LeetCode225—用队列实现栈 (java版)

题目描述:标签:栈设计请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。注意:你只能使用队列的基本操作 —— 也就是push to back、peek/...

2021-03-11 20:43:57 213

原创 LeetCode150—逆波兰表达式求值 (java版)

题目描述:标签:栈根据 逆波兰表示法,求表达式的值。有效的运算符包括+,-,*,/。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况代码:思路分析:逆波兰表达式求值1、建一个栈。2、利用增强for循环遍历,如果当前字符为数字,则压入栈中;如果当前字符为“+、-、* 、/”运算符,则弹出两个元素进行运算,并将运算结果压入栈中。3、...

2021-03-09 22:19:01 138

原创 LeetCode20—有效的括号 (java版)

题目描述:标签:栈 字符串给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。代码:思路分析:1、特殊分析:括号成双成对,字符串长度一定为偶数,所以长度为奇数的字符串一定不是有效括号字符串。2、建一个栈,遇到左括号时压入栈中,遇到右括号时,判断此时栈是不是空或者栈顶的括号是否配对,如果真则返回false,如果假则将栈顶的元素弹出与当前右括...

2021-03-08 21:19:18 103

原创 LeetCode707—设计链表(java版)

题目描述:标签:设计 链表设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性prev以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中第index个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为v...

2021-03-06 19:45:07 118

原创 LeetCode206—反转链表(java版)

题目描述:标签:链表反转一个单链表。代码:思路分析:我的思路和官方不太一样,我是新建了一个链表,然后通过头插法实现了反转。1、新建一个链表reverse2、遍历给的链表,两种情况:如果reverse.next为空的话,则直接插入元素reverse.next=node否则,需要头插元素,即node.next=reverse.next和reverse.next=node。官方给的迭代就是需要定义一个前驱结点。递归我没看懂。/** * Definition...

2021-03-05 19:54:36 116

原创 LeetCode203—移除链表元素(java版)

题目描述:标签:链表删除链表中等于给定值val的所有节点。代码:思路分析:哨兵节点,伪头结点1、定义一个哨兵节点sentinel,值为0,next指向head;2、定义一个前驱指针prev和当前指针cur,让prev指向哨兵节点,cur指向头结点,遍历链表有下面两种情况:如果cur.val = val,删除结点,即prev.next = cur.next;否则,让前驱结点后移 pre = cur同时 cur = cur.next/** * Defi...

2021-03-05 19:34:49 75

空空如也

空空如也

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

TA关注的人

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