![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
芒果蒲公英
java、性能优化
展开
-
3. 无重复字符的最长子串(Java-滑动窗口)
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子原创 2022-07-12 09:38:02 · 2998 阅读 · 0 评论 -
leetcode:2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:输入:l1 = [0], l2 = [0]输出:[0]示例 3:输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9原创 2022-07-11 14:15:49 · 2951 阅读 · 0 评论 -
leetcode两数之和(求数组下标/求数组元素)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。...原创 2022-07-09 11:05:28 · 387 阅读 · 0 评论 -
JZ78 把二叉树打印成多行
描述给定一个节点数为 n 二叉树,要求从上到下按层打印二叉树的 val 值,同一层结点从左至右输出,每一层输出一行,将输出的结果存放到一个二维数组中返回。例如:给定的二叉树是{1,2,3,#,#,4,5}该二叉树多行打印层序遍历的结果是[[1],[2,3],[4,5]]数据范围:二叉树的节点数 0≤n≤1000, 0≤val≤1000要求:空间复杂度 O(n),时间复杂度 O(n)输入描述:给定一个二叉树的根节点示例1输入:{1,2,3,原创 2022-05-22 14:49:43 · 2926 阅读 · 0 评论 -
二叉树层序、前中后序遍历(递归、迭代)
package t1;import java.util.*;public class LevelOrder { ArrayList<ArrayList<Integer>> list = new ArrayList<>(); //前中后遍历 递归调用 public static void order(TreeNode root,Queue<Integer> queue){ if(root == null) { return; .原创 2022-05-20 15:09:14 · 2928 阅读 · 0 评论 -
JZ59 滑动窗口的最大值,三种解法【较难】
描述给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6原创 2022-03-06 13:29:38 · 3281 阅读 · 0 评论 -
JZ4 二维数组中的查找(中等)
描述在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]给定 target = 7,返回 true。给定 target = 3,返回 false。数据范围:矩阵的长宽满足 0≤n,m≤500, 矩阵中的值满足0≤val≤10^9.原创 2022-03-06 12:46:17 · 2627 阅读 · 0 评论 -
JZ10 斐波那契数列
描述大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。斐波那契数列是一个满足的数列数据范围:1≤n≤40要求:空间复杂度 O(1),时间复杂度O(n) ,本题也有时间复杂度 O(logn) 的解法输入描述:一个正整数n返回值描述:输出一个正整数。示例1输入:4返回值:3说明:根据斐波那契数列的定义可知,fib(1)=1,fib(2)=1,fib(3)=fib(3-1)+fib(3-2)=2,fib(4)=fib(..原创 2022-03-06 12:39:16 · 2948 阅读 · 0 评论 -
面试中常考的排序算法(冒泡排序、选择排序、插入排序、快速排序...)
排序算法的几个重要知识点:1、时间复杂度:一个算法执行所消耗的时间。2、空间复杂度:运行完一个算法所需的内存大小。3、稳定/非稳定排序:针对排序算法,我们还有一个衡量指标是稳定性。如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。如果a在b之后,则为非稳定排序。4、原/非原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。即原地排序算法是指空间复杂度是O(1)的排序算法。其中冒泡排.原创 2021-11-26 21:35:14 · 3689 阅读 · 0 评论 -
JZ9 用两个栈实现队列(简单)
描述用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。数据范围: n≤1000要求:存储n个元素的空间复杂度为O(n) ,插入与删除的时间复杂度都是O(1)示例1输入:["PSH1","PSH2","POP","POP"]返回值:1,2说明: "PSH1":代表将1插入队列尾部 "PSH2":代表将2插入队..原创 2021-11-25 20:44:10 · 3012 阅读 · 0 评论 -
JZ28 对称的二叉树(简单)
描述给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)例如: 下面这棵二叉树是对称的下面这棵二叉树不对称。数据范围:节点数满足 0≤n≤1000,节点上的值满足 0∣val∣≤1000要求:空间复杂度O(n),时间复杂度O(n)备注:你可以用递归和迭代两种方法解决这个问题示例1输入:{1,2,2,3,4,4,3}返回值:true示例2输入:{8,6,9,5,7,7,5...原创 2021-11-25 19:58:34 · 3280 阅读 · 0 评论 -
JZ79 判断是不是平衡二叉树(简单)
描述输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。样例解释:样例二叉树如图,为一颗平衡二叉树注:我们约定空树是平衡二叉树。数据范围:0<=n≤100,树上节点的val值满足 0≤n≤1000要求:空间复杂度O(1),时间复杂.原创 2021-11-25 19:17:23 · 2981 阅读 · 0 评论 -
JZ79 判断是不是平衡二叉树(简单)
描述输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。样例解释:样例二叉树如图,为一颗平衡二叉树注:我们约定空树是平衡二叉树。数据范围:0n≤100,树上节点的val值满足0≤n≤1000要求:空间复杂度O(1),时间复杂度O(n)输.原创 2021-11-24 21:41:29 · 127 阅读 · 0 评论 -
JZ34 二叉树中和为某一值的路径(二)(中)
输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点2.叶子节点是指没有子节点的节点3.路径只能从父节点到子节点,不能从子节点到父节点4.总节点数目为n如二叉树root为{10,5,12,4,7},expectNumber为22则合法路径有[[10,5,7],[10,12]]数据范围:树中节点总数在范围[0, 5000]..原创 2021-11-24 21:12:15 · 2964 阅读 · 0 评论 -
JZ26 树的子结构(中)
描述输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构数据范围:0 <= A的节点个数 <= 100000 <= B的节点个数 <= 10000示例1输入:{8,8,7,9,2,#,#,#,#,4,7},{8,9,2}返回值:true示例2输入:{1,2,3,4,5},{2,4}返回原创 2021-11-23 17:59:23 · 3122 阅读 · 0 评论 -
JZ82 二叉树中和为某一值的路径(一)(简单)
描述给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点2.叶子节点是指没有子节点的节点3.路径只能从父节点到子节点,不能从子节点到父节点4.总节点数目为n例如:给出如下的二叉树, sum=22返回true,因为存在一条路径5→4→11→2的节点值之和为 22数据范围:1.树上的节点数满足 0≤n≤100002.每 个节点的值都满足 0∣v.原创 2021-11-23 17:12:44 · 2999 阅读 · 0 评论 -
JZ32 从上往下打印二叉树(简单)
描述不分行从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如输入{8,6,10,#,#,2,1},如以下图中的示例二叉树,则依次打印8,6,10,2,1(空节点不打印,跳过),请你将打印的结果存放到一个数组里面,返回。数据范围:0<=节点总数<=1000-1000<=节点值<=1000示例1输入:{8,6,10,#,#,2,1}返回值:[8,6,10,2,1]示例2输入:{5,4,#,3,#,2,#,1}返回值:[5,4,3,原创 2021-11-23 16:47:50 · 3262 阅读 · 0 评论 -
JZ27 二叉树的镜像(简单)
描述操作给定的二叉树,将其变换为源二叉树的镜像。数据范围:二叉树的节点数0≤n≤1000, 二叉树每个节点的值0≤val≤1000要求:空间复杂度O(n)O(n)。本题也有原地操作,即空间复杂度O(1)的解法,时间复杂度O(n)比如:源二叉树镜像二叉树示例1输入:{8,6,10,5,7,9,11}返回值:{8,10,6,11,9,7,5}说明:如题面所示示例2输入:{}返回值:{}解法: impo...原创 2021-11-22 21:08:01 · 3826 阅读 · 0 评论 -
JZ54 二叉搜索树的第k个节点(中)
描述给定一棵结点数为n 二叉搜索树,请找出其中的第 k 小的TreeNode结点值。1.返回第k小的节点值即可2.不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-13.保证n个节点的值不一样数据范围:0≤n≤1000,0≤k≤1000,树上每个结点的值满足0≤val≤1000进阶:空间复杂度O(n),时间复杂度O(n)如输入{5,3,7,2,4,6,8},3时,二叉树{5,3,7,2,4,6,8}如下图所示:该二叉树所有节点按结点值升序排列后可.原创 2021-11-22 20:49:07 · 3150 阅读 · 0 评论 -
JZ77 按之字形顺序打印二叉树(中)
描述给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)数据范围:0≤n≤1500,树上每个节点的val满足∣val∣<=100要求:空间复杂度:O(n),时间复杂度:O(n)例如:给定的二叉树是{1,2,3,#,#,4,5}该二叉树之字形层序遍历的结果是[[1],[3,2],[4,5]]示例1输入:{1,2,3,#,#,4,5}返回值:[[1],[3,2],[4,5]]说明:如题面解释,第一.原创 2021-11-22 20:17:59 · 3009 阅读 · 0 评论 -
JZ55 二叉树的深度(简单)
描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。数据范围:节点的数量满足0≤n≤100,节点上的值满足0≤val≤100进阶:空间复杂度O(1),时间复杂度O(n)假如输入的用例为{1,2,3,4,5,#,6,#,#,7},那么如下图:示例1输入:{1,2,3,4,5,#,6,#,#,7}复制返回值:4示例2输入:{}返回值:0解法:递...原创 2021-11-22 18:55:13 · 298 阅读 · 0 评论 -
JZ76 删除链表中重复的结点(较难)
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5数据范围:链表长度满足1<=n<=1000,链表中的值满足进阶:空间复杂度 O(N),时间复杂度O(N)例如输入{1,2,3,3,4,4,5}时,对应的输出为{1,2,5}:解:/* public class ListNode { ...原创 2021-11-18 20:53:30 · 3537 阅读 · 0 评论 -
JZ18 删除链表的节点(简单)
描述给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。1.此题对比原题有改动2.题目保证链表中节点的值互不相同3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点数据范围:0<=链表节点值<=100000<=链表长度<=10000示例1输入:{2,5,1,9},5返回值:{2,1,9}说明:给定你链表中值为5的第..原创 2021-11-18 20:04:39 · 2949 阅读 · 0 评论 -
JZ22 链表中倒数最后k个结点(简单)
描述输入一个长度为 n 的链表,设链表中的元素的值为 ai,返回该链表中倒数第k个节点。如果该链表长度小于k,请返回一个长度为 0 的链表。数据范围:0≤n≤10^5,0≤ai≤10^9,0≤k≤10^9要求:空间复杂度O(n),时间复杂度O(n)进阶:空间复杂度O(1),时间复杂度O(n)例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点...原创 2021-11-18 19:30:27 · 2978 阅读 · 0 评论 -
JZ25 合并两个排序的链表
描述输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。数据范围:0 \le n \le 10000≤n≤1000,-1000 \le 节点值 \le 1000−1000≤节点值≤1000要求:空间复杂度O(1)O(1),时间复杂度O(n)O(n)如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:或输入{-1,2,4},{1,3,4}时,合并后的链...原创 2021-11-18 17:28:23 · 3053 阅读 · 0 评论 -
JZ24 反转链表(简单)
描述给定一个单链表的头结点pHead,长度为n,反转该链表后,返回新链表的表头。数据范围:n\leq1000n≤1000要求:空间复杂度O(1)O(1),时间复杂度O(n)O(n)。如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。以上转换过程如下图所示:示例1输入:{1,2,3}返回值:{3,2,1}示例2输入:{}返回值:{}说明:空链表则输出空解法:直接链表反转/...原创 2021-11-18 16:49:08 · 3058 阅读 · 0 评论 -
JZ6 从尾到头打印链表(简单)
描述输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。如输入{1,2,3}的链表如下图:返回一个数组为[3,2,1]0 <= 链表长度 <= 10000示例1输入:{1,2,3}返回值:[3,2,1]示例2输入:{67,0,24,58}返回值:[58,24,0,67]解法一:本题有反转的思想,通过栈的后进先出的特性,把数据放入栈中,再把栈数据输出存储。/*** public class L.原创 2021-11-18 16:41:38 · 2954 阅读 · 0 评论 -
链表反转(递归 、迭代)
使单链表的链接顺序反转过来例如: 输入:1->2->3->4 输出:4->3->2->1方法:迭代与递归public class reverseList { public static class ListNode{ int val; ListNode next; public ListNode(int val ,ListNode next){ ...原创 2021-08-11 11:15:31 · 187 阅读 · 0 评论 -
贪心算法寻找局部最优,求最长增长序列
给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。序列的下标是连续的public class maxSeq { public static void main(String[] args) { System.out.println(findLength(new int[{1,2,3,4,2,3,4,5,6,3,4,5,6,7,8,9})); } //贪心算法寻找局部最优,求最长增长序列 public static in原创 2021-08-11 11:09:06 · 3074 阅读 · 0 评论 -
求两数之和(三种解法)
给定一个升序排列的整数数组numbers ,从数组中找出两个数满足相加之和等于目标数 target。假设每个输入只对应唯一的答案,而且不可以重复使用相同的元素。返回两数的下标值,以数组形式返回import java.lang.reflect.Array;import java.util.Arrays;public class searchTarget { public static void main(String[] args) { System.out.pr原创 2021-08-11 11:04:49 · 6492 阅读 · 0 评论