- 博客(75)
- 收藏
- 关注
原创 LeetCode-添加/删除二叉搜索树的结点
一、二叉搜索树的插入1、题目701.二叉搜索树的插入操作给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同2、思路由于二叉搜索树的特性,一直遍历直到找到为null的位置,插入即可3、代码 //一直遍历到空结点,插入即可 public TreeNode insertIntoBST(TreeNode root, int val) {
2022-02-17 16:09:59
182
1
原创 LeetCode-二叉树的公共祖先
一、236.二叉树的最近公共祖先1、题目给定一个二叉树,求树中两个指定节点的公共祖先最近的公共祖先满足:满足祖先X是P和Q的祖先且X的深度足够大。例如上图的二叉树,结点2和6的最近公共祖先为5,结点4和5的最近公共祖先是5。2、思路通过后序遍历,对每个结点自底向上查询。如何判断一个结点是否是最近公共祖先?判断左右子树返回过来的结果的包含情况,如果左子树包含P,右子树包含Q(或是相反),那么该结点就是最近公共祖先。3、代码public TreeNode lowestC
2022-02-17 15:04:57
607
原创 关于并查集的一些个人总结
一、什么是并查集?并查集是一种数据结构,通常用来判断元素之间是否属于同一个集合。在LeetCode200.岛屿数量中就可以使用并查集解决。二、基本思路使用数组存储每个元素所在的集合。例如union[2] == 1,代表第三个元素是集合1里的元素。1、初始化使用并查集,首先对并查集进行初始化,代码示例如下:private int[] union;private int size;public void initUnion(){ union = new int[size
2022-01-07 14:56:09
666
原创 LeetCode-只出现一次的数字
一、只出现一次的数字Ⅱ题目:给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。思路:将所有数字加起来,记录下每一位二进制加过的次数,其余每个元素都出现了三次,则每位二进制的次数都是3次/4次/0次。每一位都对3取余,剩下的二进制就是只出现一次元素的二进制了。问题来了,怎么保存二进制呢?用一个大小为32的int类型数组保存。代码:public int singleNumber(int[] nums) {
2022-01-04 17:08:54
881
原创 LeetCode-从前序遍历和中序遍历构造二叉树
一、题目给定一棵树的前序遍历preorder 与中序遍历 inorder。请构造二叉树并返回其根节点。例如:preorder = [3,9,20,15,7], inorder = [9,3,15,20,7],得到如下二叉树。1、分析通过前序遍历和中序遍历构建二叉树的原理就不说了,都是基础。说说怎么用代码的方式构造二叉树。一开始想到用队列能不能实现,发现写起来太复杂了,还是用递归+partition。首先看前序遍历数组,第一个数就是当前需要构造的根节点【3】,于是在中序遍历数组..
2021-12-27 16:58:27
890
原创 LeetCode-删除排序数组中的重复项
一、题目1给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。分析: 双指针,快指针fast遍历原数组,慢指针slow指向保留的最后一个元素。初始设slow = 0,fast = 1。判断是这样的:if(nums[fast] != nums[fast-1]),说明新数字没有重复出现,就把这个数字保留。代码:clas...
2021-12-24 15:18:42
458
原创 贪心系列-跳跃问题1/2
今天做到两个题有点意思,贪心问题,没做过就不会的那种题。一、跳跃游戏给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。1、分析一个题解的想法非常叼,就当作一个人持有能量,需要能量才能走,每到一个新格子都能更新能量。最后看能不能走到终点就行了。2、代码class Solution { public boolean canJump(int[] nums) {
2021-12-13 16:19:51
3315
原创 二分问题-LeetCode33-搜索旋转排序数组
一、二分最常见的二分就是用在搜索有序数组中的元素了,这会让人有个错觉:只有数组是有序的,才能使用二分。其实是这样的:每次能决定丢弃掉哪一边,都可以使用二分二、题目整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]
2021-12-10 16:26:46
352
原创 LeetCode15-三数之和
一、题目给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。二、自己的思路最先想到的就是dfs,就像组合总和这题一样,找到一个组合添加到List里,回溯一下就好了嘛但最终会遇到需要去重的问题。以下是自己的做法:class Solution { List<List<Integer>> res;
2021-12-08 16:00:41
420
原创 回溯问题-LeetCode39-组合总和
一、回溯回溯法的思想是:通过枚举,对所有的可能进行遍历。但是枚举是一直枚举到最后一个元素,发现走不通,再回退一步,枚举没有走过的元素。回溯的关键在于:走不通就回退一步。回溯的实现:for循环+递归解释如下:for循环就像一个路径选择,递归返回之后就相当于回退一步。例如第一次选择第一条路径,i = 0,进入该条路径,递归方法完成后返回,相当于回退到初始点,然后进入下一次循环。二、回溯模板public backward(){ if(回退点){ //这条路的结束点
2021-12-06 11:38:16
3591
原创 完全背包问题-LeetCode322-零钱兑换
一、题目给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。什么意思?比如给一个总金额11块钱,硬币有三种:[1,2,5],要求使用最少数量的硬币凑齐11块钱。这道题有点像左程云讲过的8类型袋子和6类型袋子装苹果的问题,但那道题是有数学规律的,因为8和6是确定的。本题则随机给硬币面额,要求最少数量。贪心会超时
2021-12-03 15:56:54
335
原创 卡特兰数-LeetCode96-不同的二叉搜索树
卡特兰数(英语:Catalan number),又称卡塔兰数、明安图数,是组合数学中一种常出现于各种计数问题中的数列。数列的前几项为:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862,...递推公式:Cn = C0*Cn-1 + C1*Cn-2 + C2*Cn-3 + ...+ Cn-1*C0一、题目:给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的二叉搜索树有多少种?返回满足题意的二叉搜索树的种数。 题目分析:节点有...
2021-12-02 15:00:04
283
原创 约瑟夫环问题
一、原题目剑指Offer62:圆圈中最后剩下的数字0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。自己的做法:模拟为圆,删除元素之后计算下一个下标,直到删除至只剩一个元素class Solution { public int la
2021-11-05 15:47:16
133
原创 剑指Offer-58
二叉搜索树的最近公共祖先给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]做法:由于给的树是二叉搜索树,可以根据结点的值来判断结点p和q分别在哪一边;而且题目要求x的深度最大,则:...
2021-11-01 20:22:17
73
原创 剑指Offer-64
求1+2+..+n求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。做法:传统的使用递归是不行的,因为一般来说终止条件使用if(n ==1) return 1; 题目要求不能使用if,则采用短路 短路的本质在于:例如A && B,当判断A为false时,B判断就不会再执行;再如A || B,如果判断出A为true,B就不会再执行class Soluti...
2021-11-01 16:12:26
63
原创 常用排序算法(二)
六、快速排序通过一次排序将数组分为两部分,左边部分是比基准元素小的部分,右边部分是比基准元素大的部分,即准确找到了基准元素应该在的位置。与归并排序不同,归并排序用一个临时数组存储当前两个待排序部分排序后的顺序。快速排序是直接在原数组上找到基准元素应该在的位置。1、算法描述在数组中选择一个元素作为基准元素,通常选择当前待排序序列中第一个元素。用一个临时变量保存基准元素的值设置两个指针low和high,从两端开始遍历,先从high开始,遇到比基准元素小的就放到low位置此时low位置的元
2021-10-31 16:19:55
101
原创 常用排序算法(一)
刷题过程中对常用的排序算法有遗忘,所以写一篇笔记。一、冒泡排序一种简单的排序算法,重复地走过要需要排序的序列,比较相邻两个元素的大小。依次将较大的元素放到数组的末尾,或是依次将较小的元素放到数组的首部,直到走访工作全部结束。1、算法过程比较相邻的元素,如果顺序错误就交换对每一对相邻元素都做相同的工作,从第一对比到最后一对已经放到最后的元素在下一轮就不需要比较了,因为它已经是当前轮次最大的元素2、代码public int[] bubbleSort(int[] nums){
2021-10-30 20:36:04
84
原创 回溯问题-例二叉树中和为某一值的路径
一、题目剑指Offer-34题,给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。二、回溯问题这道题的思路就在于二叉树的深度优先遍历,也就是先序遍历。在到达某一结点的时候,将target = target - root.val,然后再继续递归结点的左子树和右子树,看是否满足和为target。关键点是:使用的List集合,在递归到左子树完成后,会保存左子树下结点的值(执行了path.add()操作),那么在递归右子
2021-10-29 10:58:24
107
原创 剑指Offer-34
二叉树中和为某一值的路径给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。做法:dfs,回溯/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode
2021-10-28 22:29:18
66
原创 剑指Offer-36
二叉搜索树和双向链表输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。做法:dfs/*// Definition for a Node.class Node { public int val; public Node left; public Node right; public Node() {} public Node(int _val) { val = _v
2021-10-28 22:27:58
61
原创 剑指Offer-54
二叉搜索树的第k大结点给定一棵二叉搜索树,请找出其中第k大的节点。做法:二叉搜索树的中序遍历是递增序列,中序遍历之后返回第k大的元素即可/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class
2021-10-27 21:54:12
68
原创 剑指Offer-13
机器人的运动范围地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?做法:典型的DFS题目class Solution { publi
2021-10-27 21:39:07
114
原创 剑指Offer-12
class Solution { public boolean exist(char[][] board, String word) { int m = board.length; int n = board[0].length; boolean[][] visited = new boolean[m][n]; for(int i = 0; i < m; i++){ for(int j = 0; j &.
2021-10-26 21:12:01
59
原创 剑指Offer-58 Ⅰ
翻转单词顺序输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。做法:利用String类的trim()、split()方法class Solution { public String reverseWords(String s) { s = s.trim(); String[] strs = s.split("
2021-10-26 20:08:51
69
原创 剑指Offer-57
和为s的两个数字输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。做法:递增数组,指针指向两端,从两端开始寻找即可class Solution { public int[] twoSum(int[] nums, int target) { //递增排序数组,从两端开始找元素 int left = 0; int right = nums.length-1;
2021-10-26 19:33:29
59
原创 剑指Offer-21
调整数组的顺序使奇数位于偶数的前面输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。做法:双指针,前指针遇到偶数就与后指针位置的元素交换,后指针--,前指针不变继续判断交换过来的元素class Solution { public int[] exchange(int[] nums) { //前后指针,前方指针遇到偶数就与后指针位置的元素交换 //交换后,后指针所指位置一定是偶数,后指针--
2021-10-26 19:28:52
65
原创 剑指Offer-25
合并两个排序的数组输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。做法:双指针/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode mergeTwo
2021-10-24 16:06:11
59
原创 剑指Offer-22
链表中倒数第k个结点输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。做法1:使用栈/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next;
2021-10-24 15:48:47
62
原创 剑指Offer-18
删除链表的节点给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。做法:用两个指针记录下当前结点和当前结点的前一个结点即可/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solutio
2021-10-24 15:32:43
58
原创 剑指Offer-46
把数字翻译成字符串给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。做法:有条件限制的青蛙跳台阶问题,如果当前字母和前一个字母可以合并翻译,则dp[n] = dp[n-1] + dp[n-2],如果只能自己翻译,则dp[n] = dp[n-1]class Solution { public int trans
2021-10-24 12:13:43
37
原创 剑指Offer-48
最长不含重复字符串请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。做法:使用HashMap记录每个字符最后一次出现的位置,如果出现重复的字符,就把当前字符上一次出现位置的下一个位置作为新起点,继续遍历class Solution { public int lengthOfLongestSubstring(String s) { int max = 0; int left = 0; Map<Charact
2021-10-24 12:10:36
56
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人