
递归
圆滚滚的柴柴
这个作者很懒,什么都没留下…
展开
-
NC33 合并两个排序的链表
题目:NC33 合并两个排序的链表思路:递归思路:递归函数返回的是合并后的链表;若两个节点有空,则返回另一个节点;递归函数要做的是,比较当前两个节点的值,较小的节点的下一个继续参与递归,返回这个较小的节点。代码:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Sol原创 2021-08-19 20:36:00 · 511 阅读 · 0 评论 -
牛客 剑指offer:最长公共前缀
题目:最长公共前缀思路1:排序所有字符串排序,然后只需找到第一个和最后一个元素的公共前缀。思路2:分治代码1:import java.util.*;public class Solution { /** * * @param strs string字符串一维数组 * @return string字符串 */ public String longestCommonPrefix (String[] strs) { //原创 2021-04-20 19:26:44 · 112 阅读 · 0 评论 -
牛客 剑指offer:输出二叉树的右视图
题目:输出二叉树的右视图思路:递归简历二叉树,然后借助队列广搜,找到每层最右的节点。代码:import java.util.*;class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode (int v) { this.val = v; this.left = null; this.right = null; }}publ原创 2021-04-13 19:09:14 · 196 阅读 · 0 评论 -
牛客 剑指offer:岛屿数量
题目:岛屿数量思路:深搜。从头遍历矩阵,如果遇到一个1,解加1,然后深搜把这个1相连的1全部置为0。注意:深搜要搜上下左右四个方向,不能只搜索右和下,因为有可能出现“ɔ”这种形状的岛屿,只搜索右方和下方不能覆盖这种情况。代码:import java.util.*;public class Solution { /** * 判断岛屿数量 * @param grid char字符型二维数组 * @return int整型 */ priva原创 2021-04-09 11:38:16 · 166 阅读 · 0 评论 -
牛客 剑指offer:二叉树镜像
题目:二叉树镜像思路:递归。递归函数返回的是已经镜像好的树;递归函数要做的是交换已经镜像好的左右子树。代码:import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = val; * } * } */p原创 2021-03-18 16:50:14 · 124 阅读 · 0 评论 -
leetcode Java:50. Pow(x, n)
题目:50. Pow(x, n)思路:快速幂Java实现的过程中,需要把int转long,因为负数会溢出。代码:class Solution { public double myPow(double x, int n) { long N = n; if (n < 0) { return 1.0 / Pow(x, -N); } return Pow(x, N); } public d原创 2021-03-12 15:22:36 · 103 阅读 · 0 评论 -
牛客 剑指offer:斐波那契数列
题目:斐波那契数列思路:递归代码:public class Solution { public int Fibonacci(int n) { if (n == 0) { return 0; } if (n == 1) { return 1; } return Fibonacci(n - 1) + Fibonacci(n - 2); }}...原创 2021-03-12 14:45:58 · 104 阅读 · 0 评论 -
牛客 剑指offer:反转链表
题目:反转链表思路:递归。递归函数返回的是 已经反转好的链表。代码:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode ReverseList(ListNode head) { if (head ==原创 2021-03-09 15:25:49 · 104 阅读 · 0 评论 -
牛客 剑指offer:合并有序链表
题目:合并有序链表思路:递归 , 迭代。迭代的思路比较简单,新建一个节点,把两条链表串起来即可。递归:递归函数返回的是:排序好的节点递归函数要做的是:把节点链起来。代码:import java.util.*;/* * public class ListNode { * int val; * ListNode next = null; * } */public class Solution { /** * * @param l1 ListN原创 2021-03-05 14:54:16 · 80 阅读 · 0 评论 -
leetcode Java二刷:46. 全排列
题目:46. 全排列思路:回溯。新建一个visited数组,表示数字是否使用过。不使用额外的空间,用原本数字记录是否使用过。这个官方题解 讲的很清楚。把原数组看作2部分,左侧是已经访问过的数字,右侧是待访问的数字。记录当前需要放数字的位置,然后不断交换当前位置的数字与待访问的数字。代码:class Solution { public List<List<Integer>> permute(int[] nums) { List<List<原创 2021-03-03 17:42:10 · 132 阅读 · 2 评论 -
牛客 剑指offer:跳台阶
题目:跳台阶思路:递归。代码:public class Solution { public int jumpFloor(int target) { if (target <= 0) { return 0; } if (target == 1) { return 1; } if (target == 2) { return 2;原创 2021-03-03 16:22:04 · 68 阅读 · 1 评论 -
牛客 剑指offer:判断二叉树是否对称
题目:判断二叉树是否对称思路:递归:递归函数返回的是,是否对称。迭代:借助队列。代码,递归:import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */public class Solution { /** * * @param root TreeNode类原创 2021-03-03 15:25:47 · 103 阅读 · 1 评论 -
牛客 剑指offer:k个一组翻转链表
题目:k个一组翻转链表思路:递归递归函数返回已经反转好的链表;递归函数需要把本次翻转好的链表 链到 下一次翻转好的链表上。代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNod原创 2021-03-02 17:50:17 · 132 阅读 · 0 评论 -
牛客 剑指offer:根据前序后序重建二叉树
题目:重建二叉树思路:对于前序遍历,根节点必定第一个出现;对于中序遍历,根节点的左子树的所有结点必定在根节点的左侧,右子树的所有结点必定在根节点的右侧。代码:/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */impor原创 2021-03-02 14:45:51 · 162 阅读 · 0 评论 -
leetcode Java二刷:40. 组合总和 II
题目:思路:回溯仍然,先排序,用目标值不断减去放入结果集合的数字,这样目标值与0比较即可判断是否找到解;加速剪枝:回溯的过程中,如果目标值减去当前数字小于0,那么后面所有数字都不可能满足条件了(已经排序),此时直接返回;跟上一题不同的是:数字不能重复使用,所以回溯搜索时要从下一个位置开始。去重:同层不能有重复,不同层可以重复,即:不能出现:可以出现:如何保证同层不重复呢?candidates[i] == candidates[i - 1],然而这样也会剪掉不同层重复的情况如何保证不同原创 2021-02-22 15:21:41 · 81 阅读 · 0 评论 -
leetcode Java二刷:39. 组合总和
题目:39. 组合总和思路:回溯为了方便后续处理,我们先排序。我们用目标值不断减去放入结果集合的数字,这样目标值与0比较即可判断是否找到解;加速剪枝:回溯的过程中,如果目标值减去当前数字小于0,那么后面所有数字都不可能满足条件了(已经排序),此时直接返回;去重剪枝:这道题,数字可以重复使用,去重剪枝包含两块:(1)对于重复的数字,我们只考虑第一个,其余的全部跳过;(2)每一次的搜索都从当前位置开始,不考虑当前位置之前的数字,因为之前的数字已经搜索过了。例1:1113,targe原创 2021-02-22 14:55:02 · 78 阅读 · 0 评论 -
leetcode Java二刷:38. 外观数列
题目:38. 外观数列思路:递归。递归参数n,递归函数返回的是外观数列的第n项。代码:class Solution { public String countAndSay(int n) { return recursion(n); } public String recursion(int n) { if (n == 1) { return "1"; } String s = recur原创 2021-02-22 14:36:06 · 85 阅读 · 0 评论 -
leetcode Java二刷:37. 解数独
题目:37. 解数独思路:回溯。在每一个空格处尝试放入1~9,需要注意的是,如果找到解就不回溯了,因为我们要把解存在原来的数据结构里。代码:class Solution { private boolean[][] row = new boolean[9][9]; private boolean[][] col = new boolean[9][9]; private boolean[][] box = new boolean[9][9]; public vo原创 2021-02-21 15:35:47 · 93 阅读 · 0 评论 -
leetcode Java二刷:25. K 个一组翻转链表
题目:25. K 个一组翻转链表思路:首先,我们根据k把链表分成,待翻转的链表,待翻转的前驱,待翻转的后继;对需要翻转的部分翻转,然后更新指针,继续上一步,直到全部翻转完成。翻转一组链表:递归实现。递归函数返回的是已经翻转完成的链表;递归函数要做的是把当前的节点head,连接到已经翻转完成的链表尾部;翻转完成后head刚好指向翻转后的尾部节点。递归函数的返回条件是,节点为空或者节点的下一个为空。代码:/** * Definition for singly-linked list.原创 2021-01-13 19:17:12 · 94 阅读 · 0 评论 -
leetcode Java二刷:24. 两两交换链表中的节点
题目:24. 两两交换链表中的节点思路:递归 和 非递归。递归:递归函数返回的是已经交换过的节点;递归函数内部需要实现两个节点的交换非递归:遍历链表实现交换即可。代码,递归:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.原创 2021-01-13 19:07:04 · 137 阅读 · 0 评论 -
leetcode Java二刷:22. 括号生成
题目:22. 括号生成思路:回溯。左括号和右括号最多n个;如果已经使用的左括号小于n,那我们还可以使用左括号;如果已经使用的右括号小于n,那我们也还可以使用右括号;注意剪枝:如果剩余可使用的左括号小于右括号,那么此时不满足条件,因为有一个右括号提前在左括号之前被使用了。代码:class Solution { public List<String> generateParenthesis(int n) { List<String> res =原创 2021-01-13 17:47:26 · 89 阅读 · 0 评论 -
leetcode Java二刷:17. 电话号码的字母组合
题目:17. 电话号码的字母组合思路:回溯。代码:class Solution { public List<String> letterCombinations(String digits) { Map<Character, String> map = new HashMap<>(); map.put('2', "abc"); map.put('3', "def"); map.put('4',原创 2021-01-11 19:05:57 · 77 阅读 · 0 评论 -
leetcode Java二刷:14. 最长公共前缀
题目:14. 最长公共前缀思路1:纵向查找。从左至右遍历所有字符串的每一列,如果有不一致就停止。思路2:分治。所有字符串的公共前缀必定是任意两个字符串的公共前缀的子串,所以就可以采用分治的思想。代码1:class Solution { public String longestCommonPrefix(String[] strs) { if (strs.length < 1) { return ""; } int原创 2021-01-08 10:04:38 · 108 阅读 · 0 评论