![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
你好y
这个作者很懒,什么都没留下…
展开
-
55. 跳跃游戏、45. 跳跃游戏 II
55. 跳跃游戏给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。题解:每次不去看具体跳几步,而是看跳跃的范围能不能覆盖到整个数组,这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点//本题不要拘泥于每次跳几步,而是看每次能跳的范围能不能覆盖到数组最后class Solution { public boolean canJump(int[] nums) { int c原创 2022-01-25 10:34:41 · 2649 阅读 · 0 评论 -
501. 二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按 任意顺序 返回。假定 BST 满足如下定义:结点左子树中所含节点的值 小于等于 当前节点的值结点右子树中所含节点的值 大于等于 当前节点的值左子树和右子树都是二叉搜索树提示:树中节点的数目在范围 [1, 104] 内-105 <= Node.val <= 105题解使用中序遍历+map存储/** * Definiti原创 2022-01-21 15:42:26 · 481 阅读 · 0 评论 -
106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树、654. 最大二叉树
106. 从中序与后序遍历序列构造二叉树根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。题解/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val =原创 2022-01-21 08:41:34 · 411 阅读 · 0 评论 -
101. 对称二叉树、100. 相同的树、572. 另一棵树的子树
101. 对称二叉树给你一个二叉树的根节点 root , 检查它是否轴对称。题解递归解法/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * Tree原创 2022-01-19 16:07:42 · 713 阅读 · 0 评论 -
459. 重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。代码:class Solution { public boolean repeatedSubstringPattern(String s) { if(s.equals("")) return false; int len=s.length(); // 原串加个空格(哨兵),使下标从1开始,这样j从0开始,也不用初始化了原创 2022-01-15 08:59:04 · 190 阅读 · 0 评论 -
151. 翻转字符串里的单词
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。说明:输入字符串 s 可以在前面、后面或者单词间包含多余的空格。翻转后单词间应当仅用一个空格分隔。翻转后的字符串中不应包含额外的空格。题解代码:class Solution { public String reverseWords(String s) { //去除字符串的首原创 2022-01-13 10:07:28 · 53 阅读 · 0 评论 -
15. 三数之和、18. 四数之和
15. 三数之和给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。单层循环+双指针求解代码:class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> res原创 2022-01-12 10:32:51 · 322 阅读 · 0 评论 -
49. 字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。思路:字母异位词排好序之后一定都一样,将其作为key,对应的字符串放到集合里再存入到map的value里,map在添加元素之前先判断是否存在该key,如果不存在,v放入空集合,如果存在,先根据key获得对应的v的集合后,再将字符串添加到集合中代码:class Solution { public List<List&原创 2022-01-10 09:34:20 · 119 阅读 · 0 评论 -
面试题 02.07. 链表相交
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:思路:先计算两个链表的长度,规定某个指针指向长链表,剩下的那个指针指向短链表,再让两个链表尾部对齐,即让指向两个链表头结点的指针处在同一起跑线上,之后遍历链表找到第一个相同的结点返回。注意:链表相交指的是内存地址相等而不是存放元素的数值相等,且相交后,后续结点一定也都相同。代码:/** * Definition for原创 2022-01-09 09:41:36 · 221 阅读 · 0 评论 -
707. 设计链表
设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一原创 2022-01-08 10:05:07 · 68 阅读 · 0 评论 -
76. 最小覆盖子串
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。滑动窗口解答:以下为在力扣看的大佬的题解,记录学习java代码:class Solution { public String minWindow(String s, String t) { //创建数组用来表示目标所需字符的个数ascii范围 int[] need=new int[128];原创 2022-01-06 10:09:19 · 630 阅读 · 0 评论 -
283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。题解class Solution { public void moveZeroes(int[] nums) { int slow=0,fast=0; for(;fast<nums.length;fast++){ if(nums[fast]!=0){ nums[slow]=nums[fast];原创 2022-01-04 08:49:57 · 442 阅读 · 0 评论 -
79. 单词搜索
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。题解class Solution { boolean flag=false;; public boolean exist(char[][] board, String word) {原创 2022-01-01 09:22:38 · 199 阅读 · 0 评论 -
377. 组合总和 Ⅳ
题目给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。题解class Solution { int[] memo; public int combinationSum4(int[] nums, int target) { if(nums.length==1 && nums[0]>target) retu原创 2021-12-31 10:02:56 · 244 阅读 · 0 评论 -
131. 分割回文串和93. 复原 IP 地址
题目给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。题解class Solution { List<List<String>> res=new ArrayList<>(); public List<List<String>> partition(String s) { backtrack(s,0,new Ar原创 2021-12-30 08:45:05 · 1292 阅读 · 0 评论 -
491. 递增子序列
题目给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。题解class Solution { List<List<Integer>> res=new ArrayList<>(); public List<List<Integer>> findSubsequenc原创 2021-12-28 10:01:14 · 345 阅读 · 0 评论 -
77. 组合
题目给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。代码:class Solution { public List<List<Integer>> combine(int n, int k) { List<List<Integer>> res=new ArrayList<>(); backtrack(res,n,k,1,new ArrayL原创 2021-12-28 09:15:34 · 129 阅读 · 0 评论 -
39. 组合总和、40. 组合总和 II
题目给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于 150 个。下面是在力扣上看到一位大佬的评论,写的超赞,学习下回朔法的思想: 回朔法的重要思想在原创 2021-12-25 13:46:03 · 294 阅读 · 0 评论 -
非递归实现二叉树的先、中、后序排列
NC45 实现二叉树先序,中序和后序遍历描述给定一棵二叉树,分别按照二叉树先序,中序和后序打印所有的节点。思路:利用进栈和出栈的顺序巧妙实现代码:import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */public class Solution { /** *原创 2021-12-24 09:40:43 · 558 阅读 · 0 评论 -
NC41 最长无重复子数组
描述给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组算法思路我们可以利用双指针模拟一个滑动窗口。初始化该窗口为(left, right]。所以left从-1开始。窗口不断往右扩大。因为我们要的是无重复子数组,因此,遇到有重复的数字,在窗口左侧进行缩小。在每次滑动时,对窗口的大小进行比较,保留最大的长度。import java.uti原创 2021-12-24 08:59:19 · 496 阅读 · 0 评论 -
两个栈实现队列
描述用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。数据范围: n≤1000n\le1000n≤1000要求:存储n个元素的空间复杂度为 O(n)O(n)O(n) ,插入与删除的时间复杂度都是 O(1)O(1)O(1)import java.util.Stack;public class Solution { Stack<Inte原创 2021-12-22 09:18:24 · 166 阅读 · 0 评论 -
Leetcode:17. 电话号码的字母组合
一说起排列组合就是树形递归,到现在也见了不少这种类型的题了,还是不会,再记录下吧思路:利用数组索引和字符串对应,将字符串存到字符数组里,产生对应关系。之后就要想怎么处理递归,参数要求,根据输入的数字字符,转换为数字,从而从字符数组中取出对应的字符串,遍历字符串,每次加上索引对应的单个字符,如果字符串的长度==题中给的字符数组长度,说明走到了树的叶子节点,将生成的字符串加入到集合中代码:class Solution { List<String> res=new ArrayLis.原创 2021-10-16 10:54:14 · 76 阅读 · 0 评论 -
连续子数组的最大和以及变形
题目一:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值思路:创建一个新数组B用于存放数组i之前的最大子数组的和,从前往后遍历原数组A,计算数组A当前i元素的值+B数组的i-1元素的值的和 与数组A当前元素的值比较大小,选择大的存放在数组B中。最后数组B中最大的元素就是连续子数组的最大和题目二输入一个整数数组,任意连续的两个或多个整数为一个子数组,求子数组的最大和。思路:这道题和上道题的不同在于这道题规定了子数原创 2021-10-15 11:19:03 · 311 阅读 · 0 评论 -
纸牌问题
一张牌的情况不止一张牌的情况后手:当i==j 只有一张牌的时候,轮不到你挑,先手就拿走了,先手可能会选i,那后手的范围就变成了i+1,j。先手也有可能选择j,那后手的范围就变成了i,j-1。然而对手一定会让你选最小值代码:package dp;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class ZhiPaiBoYi { .原创 2021-10-14 11:13:25 · 156 阅读 · 0 评论 -
数字转换字符串
题目规定1和A对应、2和B对应、3和C对应…那么-一个数字字符串比如"111",就可以转化为"AAA"、“KA” 和"AK"。给定一-个只有数字字符组成的字符串str,返回有多少种转化结果。标准的从左向右模型:当前选择那一块作为开始部分对于每一个数字可以选择本身自己转化,也可以选择本身+下一个数字转化,但是并不是两种决定都能做出的,因为还要考虑数字的大小有没有超过26。同时选择自身做决定也不一定成功,例如0不对应任何字符,在其后面再加任何数字都没有对应的字符02–无效的。即两种选择都可能原创 2021-10-11 18:11:18 · 1673 阅读 · 0 评论 -
打印字符串的排列问题(字符串的全排列)
全排列就是别人选过之后你就不能选了。例如:第一个由三种选择,但是第二个就只有两种,最后一个有一种。从左往右的模型,前面用过的字符后面就不能用了。将所有的字符放到集合里面去递归含义:集合中的字符都可以选择,形成的所有全排列放到结果集合里,沿途的决定就是path,集合为空:所有字符都选择完了,将沿途决定放到结果集里面。打印一个字符串的全部排列(可以重复)set中每一个字符都可以作为当前字符,但是一旦当前决定要,后序就不能再使用了。创建一个集合,复制原来的字符集合,但是移除掉你刚才已经添加过的字符.原创 2021-10-11 14:27:45 · 288 阅读 · 0 评论 -
汉诺塔问题和打印全部子序列
汉诺塔问题思路怎么移动都可以,必须小压大(小数只能放在大数上面),步骤数最小左到右函数几层汉诺塔问题,1~(n-1)为了给n腾路,将其移动到中间,之后在将左边的n移动到右边即可。三大步骤当只有一层的时候,直接打印就行了。又分为了三步需要把这些函数补齐,这些函数是相互调用的。主函数调用其中一个函数就行了总结过程:即将前n-1个移动到其他的地方,再将n移动到目的地,最后再将n-1也移动到目的地处加参数可以将上面要写好多函数变成一个函数。将其具有共同特点的函数变成一个题目代码:.原创 2021-10-10 17:45:59 · 204 阅读 · 0 评论 -
课后作业3-独立的小易
代码:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main { public static void main(String[] args) throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(Sys..原创 2021-10-09 10:48:22 · 85 阅读 · 0 评论 -
最大收益问题以及求数据流中的中位数
那个是纯利润,收回来的钱=费用加上纯利润最多能做k个项目,w为项目启动资金。讲花费放到小根堆里面,再将小于等于初始启动资金的项目放到大根堆里面做完第一个项目后资金=原有资金+纯利。再解锁小根堆里面小于等于启动资金的项目放到大根堆里面。挑选利润最大的项目去做无法完成指定任务就必须要返回的情况(没有项目可以挑了)总结:1、先将小根堆里面符合条件的解锁到大根堆里面2、判断大根堆是否为空,为空说明没有满足的项目可以去执行,提前返回。不为空,将堆顶元素弹出,并且启动资金=原启动资金+利润收入.原创 2021-10-09 09:30:36 · 131 阅读 · 0 评论 -
随堂习题-切金条
例如:先将数字放进小根堆,每次弹出两个,合成一个再扔进去,合的顺序反过来就是切的顺序随堂习题-切金条代码:import java.io.*;import java.util.PriorityQueue;public class Main { public static void main(String[] args) throws IOException { BufferedReader br=new BufferedReader(new InputStre原创 2021-10-07 11:49:23 · 99 阅读 · 0 评论 -
堆
堆就是一个完全二叉树( 1、不能无左孩子,而有右孩子2、只要出现只有一个孩子的节点,后序结点一定是叶子节点(无左右孩子))while包含两种停止条件:1、你已经不比父节点大了2、当前index来到了数组0位置在已经是大根堆的数组中用变量记录下第一个元素就是堆中最大的元素,再将有效区最后一个元素赋值给数组第一个元素,将有效区减减,再heapify调正堆(用父节点和最大的孩子比较,直到走到堆的低,超出数组的长度)堆排序系统中默认的堆定义比较器实现大根堆...原创 2021-10-07 11:21:37 · 84 阅读 · 0 评论 -
会议室问题和拼接所有字符串产生字典序最小的字符串思路和代码实现
一个会议室安排会议的数量最多:谁的会议结束时间早,先安排谁另一个问题:怎么拼接字符串让最后的字典序最低思想当字符串长度一样的时候,按照二进制数来比较当字符串长度不一样的时候:短的字符串先补齐(末尾补0)和长的字符串一样,再比较并不是按照单个字符串的字典序比较高低再拼接起来例如:第二种策略:先将两个字符串拼接起来,比较大小题目核心代码:import java.util.*;public class Solution { /** * *原创 2021-10-07 09:57:57 · 196 阅读 · 0 评论 -
前缀树实现思路和例题
前缀树:每次加字符都从头结点开始加,看有没有通向该字符的路有就复用,没有就新建。e(end):到该字符为止,该字符串被加入几次。例如:问“bk”字符串被加入几次,发现k处的e=0,则说明一次都没被加入过。p(pass):经过该字符有几次。例如:问以”ab“开头的字符串有几个,发现b的p=3,所以有3个。头节点即代表有多少个以空“”开头的字符串,也代表你总共加入多少个字符串数组(例如:26个字母)hash表插入字符串构建前缀树在前缀树查找字符串出现几次提前没路查找有多少个以某字符串..原创 2021-10-06 11:57:27 · 107 阅读 · 0 评论 -
二叉树根节点到叶子节点和为指定值的路径
问题思路:因为是从根节点到叶子节点,先将根节点的数据添加到中间集合list中,再在左右两个字数上查找,每次查找到一个节点先存入list集合中,直到到叶子节点,如果这条路不符合条件,再回溯,将list集合中的元素一步步恢复到上次的状态,再尝试其他的路径,如果路径符合条件再将其list 添加到最后集合res中核心代码:import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = nul原创 2021-10-05 11:59:44 · 255 阅读 · 0 评论 -
求二叉树的之字形层序遍历
思路:用队列的size来做循环,每次把队列中的元素弹出来后,加到list集合中,等循环结束后,list集合已经装好了一层的节点数值,再装入到res里面核心代码:import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */public class Solution { /** *.原创 2021-10-05 11:22:39 · 77 阅读 · 0 评论 -
折纸问题(中序遍历二叉树)
思路介绍折两次有三次折痕,分别是凹凹凸。折三次后,凹凹凸凹凹凸凸。连续折叠n次,依次输出折纸的凹凸。考察二叉树基础:即二叉树的中序遍历,遍历我们脑海中的二叉树这棵树的特点:1、根节点是凹折痕2、左树是以凹折痕为头,右树以凸折痕为头随堂练习代码:import java.io.*;import java.util.*;public class Main{ //StringBuilder sb=new StringBuilder(); public原创 2021-10-05 10:45:32 · 175 阅读 · 0 评论 -
如何判断一颗二叉树是不是另一-棵二叉树的子树?(思路)
T2是T1的子树这种情况T2不是T1的子树判断两个不相交的树,其中一颗树的结构和另外一颗树的子树的结构是否一样?将T1序列化字符串,将T2也序列化,如果T2的字符串是T1的字串,则说明T2和T1的子树结构一样...原创 2021-10-05 09:50:22 · 203 阅读 · 0 评论 -
树的序列化和反序列化思路和代码实现
先序的方式序列化:空结点不能忽略第一棵树还原:以下划线做分割,得到一串序列,拿到序列后因为是先序序列化的,反序列化的时候也要先序,即拿到序列后先建头,再建左节点,再建右结点空结点用#_ 占位,再把头结点序列化一下(值_),在序列化左树,加到后面,再序列化右树反序列化:将其分割成一个个字符,并把这些字符加到队列里面...原创 2021-10-05 09:38:41 · 241 阅读 · 0 评论 -
随堂习题-在二叉树中找到一个节点的后继节点
代码:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.StreamTokenizer;import java.util.Scanner;public class Main{ //???? private static StreamTokenizer st = new StreamTokenizer(new Buff.原创 2021-10-04 11:22:26 · 69 阅读 · 0 评论 -
寻找前驱节点和后继节点思路
思路一:可以不加父节点,中序遍历,之后找结点的下一个结点就ok思路二:有父节点,给出某一个节点,找其后继节点,1)该节点有右树,则后继节点就是该节点右子树上的最左结点2)当X结点没有右孩子时,向上找一旦发现某个孩子时父节点的左孩子时停,父节点就是当初找要的结点的后继找前驱结点???...原创 2021-10-04 11:10:30 · 1574 阅读 · 0 评论