![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法题
练习j剑指offer习题
achong_2050
这个作者很懒,什么都没留下…
展开
-
173. 二叉搜索树迭代器
1. 题目描述2. 解法1 扁平化法思路: 首先将二叉搜索树中元素通过dfs搜索遍历所有元素,保存至数组。定义一个指针实现移动取值;通过判断指针是否在数组索引区间来判断是否存在下一个值代码:# Definition for a binary tree node.class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left原创 2021-03-28 11:04:01 · 84 阅读 · 0 评论 -
leetcode 61.旋转链表
1. 题目描述2. 解题方法思路: 寻找规律,闭合为环。将链表收尾相连后,只需要移动head指针即可以实现右移。步骤如下:遍历链表,统计节点数目n;当k大于n时,出现循环移动。用k = k%n减少冗余的移动;找到规律,从head节点开始移动n-1-k%n步找到移动后的尾节点;最后断开收尾节点。代码: public ListNode rotateRight(ListNode head, int k) { if(head==null||head.ne原创 2021-03-27 14:10:53 · 57 阅读 · 0 评论 -
面试题14- II. 剪绳子 II 贪心算法与动态规划的区别
参考链接https://leetcode-cn.com/problems/jian-sheng-zi-ii-lcof/solution/javatan-xin-si-lu-jiang-jie-by-henrylee4/1.题目描述给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m] 。请...原创 2020-05-06 19:32:48 · 170 阅读 · 0 评论 -
面试题25. 合并两个排序的链表 优先队列和原地修改法
题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4限制:0 <= 链表长度 <= 1000来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof著作权归领扣网络所有。商业转载请联系原创 2020-05-27 13:15:13 · 201 阅读 · 0 评论 -
面试题24. 反转链表 递归法
题目描述面试题24. 反转链表定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL解法1.双指针法思路借助两个指针,cur、pre,分别指向当前节点和前一个节点。从null节点开始,这样可以避免第一个节点特殊处理,引入判断设置一个tmp指针,用于保存后序节点的信息pre节点后继节点修改,实现局部逆序更原创 2020-05-27 10:34:09 · 136 阅读 · 0 评论 -
面试题53 - I. 在排序数组中查找数字 I 二分查找 左、右边界
题目描述面试题53 - I. 在排序数组中查找数字 I统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0限制0 <= 数组长度 <= 50000方法1.二分查找法思路有序递增数组,题解往往涉及到二分查找,题目分类为简单,但是更加重要的是掌握二分法思想通过二分查找法,分别找到target区间的原创 2020-05-28 23:00:45 · 199 阅读 · 0 评论 -
面试题48. 最长不含重复字符的子字符串 动态规划及优化
1.题目请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。2.方法2.1动态规划思路对于字符串、数组的求长度,数量问题,往往采用dp方法。定义状态:dp[i]dp[i]dp[i]为以s.charAt(i)s.charAt(i)s.charAt(i)为结束的最长不重复字串状态转移:dp[i]dp[i]dp[i]等于当前字符往前搜索至重复字符为原创 2020-06-12 21:49:59 · 236 阅读 · 0 评论 -
面试题42. 连续子数组的最大和 动态规划
题目描述输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。提示:1 <= arr.length <= 10^5-100 <= arr...原创 2020-05-07 21:56:50 · 122 阅读 · 0 评论 -
面试题14- I. 剪绳子 暴力递归与动态规划解法+java代码
1.题目描述给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m] 。请问 k[0]k[1]…*k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 ×...原创 2020-05-06 18:27:43 · 246 阅读 · 0 评论 -
122. 买卖股票的最佳时机 II 暴力搜索
题目描述给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这...原创 2020-04-26 16:14:43 · 169 阅读 · 0 评论 -
121. 买卖股票的最佳时机 动态规划
121. 买卖股票的最佳时机题目描述给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,...原创 2020-04-24 11:45:29 · 161 阅读 · 0 评论 -
337. 打家劫舍 III
题目描述在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3...原创 2020-04-24 01:27:09 · 206 阅读 · 0 评论 -
最长回文子串
5. 最长回文子串题目描述给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”思路暴力法 先写一个判断是否为回文的函数,在通过两层循环 不断跌遍历出所有回文长度,记录最长回文。动态规划方法 找出根据...原创 2020-04-22 17:21:42 · 87 阅读 · 0 评论 -
打家劫舍 II
213. 打家劫舍 II题目描述你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [2...原创 2020-04-21 16:24:38 · 98 阅读 · 0 评论 -
俄罗斯套娃、打家劫舍
354. 俄罗斯套娃信封问题问题描述给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。说明:不允许旋转信封。示例:输入: envelopes = [[5,4],[6,4...原创 2020-04-20 23:51:38 · 98 阅读 · 0 评论 -
152. 乘积最大子数组_最大最小策略
152. 乘积最大子数组1.题目描述给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字)。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。来源:力扣(LeetCode)链接:http...原创 2020-04-17 00:37:54 · 692 阅读 · 0 评论 -
53. 最大子序和_动态规划
题目描述给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-subarray著作...原创 2020-04-15 23:44:33 · 110 阅读 · 0 评论 -
120. 三角形最小路径和_动态规划
120. 三角形最小路径和1.题目描述给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[[2],[3,4],[6,5,7],[4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/tri...原创 2020-04-14 14:50:16 · 110 阅读 · 1 评论 -
1143. 最长公共子序列_动态规划
1143. 最长公共子序列1.题目描述给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字...原创 2020-04-14 00:25:47 · 140 阅读 · 0 评论 -
300. 最长上升子序列_动态规划
300. 最长上升子序列描述:给定一个无序的整数数组,找到其中最长上升子序列的长度。链接:https://leetcode-cn.com/problems/longest-increasing-subsequence/思路:最近开始学习动态规划,拿到这个题目完全没有思路,看的题解。上面给出了两种思路动态规划和二分查找。我重点在学习动态规划,我阅读过后的理解。动态规划是一种增量式解题策略...原创 2020-04-12 19:23:43 · 112 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
1.题目输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2.解法2.1自顶向下递归原创 2020-07-07 11:28:27 · 94 阅读 · 0 评论 -
21. 合并两个有序链表
1.合并两个有序链表将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。2.解法2.1 归并法 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1==null) return l2; if(l2==null) return l1; ListNode head=null, p3=null;原创 2020-06-22 15:44:52 · 92 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法
1. 剑指 Offer 65. 不用加减乘除做加法大佬清晰的题解:https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/solution/er-jin-zhi-qiu-he-chao-xiang-xi-da-bai-10000yong-h/2.方法思路:两个数a,b的加法等于不进位和加上进位。前者等于a^b,后者等于两个数的与运算在左移得到。由于,在求解a,b的和的过程中,最后需要不进位和加上进位,所以递原创 2020-06-19 21:54:26 · 102 阅读 · 0 评论 -
不重复元素的排列和包含重复元素的排列 采用深度优先搜索方法
参考链接:https://leetcode-cn.com/problems/permutations-ii/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liwe-2/1.全排列题目描述给定一个 没有重复 数字的序列,返回其所有可能的全排列。思路参考链接https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-python-dai-ma-java-da.原创 2020-06-02 15:27:31 · 637 阅读 · 0 评论 -
面试题55 - II. 平衡二叉树
题目描述输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3 / \ 4原创 2020-05-09 23:28:26 · 215 阅读 · 0 评论 -
面试题55 - I. 二叉树的深度 dps法与层次遍历法
二叉树的深度 题目描述输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。提示:节点总数 <= 10000来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/er-cha-shu-de-原创 2020-05-09 23:13:35 · 204 阅读 · 0 评论 -
面试题34. 二叉树中和为某一值的路径 dfs遍历
题目描述输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:[[5,4,11,2],[5原创 2020-05-09 09:53:08 · 186 阅读 · 0 评论 -
面试题16. 数值的整数次方 递归解法
题目描述实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。示例 1:输入: 2.00000, 10输出: 1024.00000示例 2:输入: 2.10000, 3输出: 9.26100示例 3:输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 = 1/4 = 0.25来源:力扣(LeetCode)链接:https://leetcode-原创 2020-05-08 22:56:26 · 323 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
1.题目找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3限制:2 <= n <= 100000来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de原创 2020-07-06 16:54:54 · 67 阅读 · 0 评论 -
面试题61. 扑克牌中的顺子 排序+遍历法
1.题目面试题61. 扑克牌中的顺子从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。2.解法2.1set去重+差值思路: 如果在数值中不存在重复数值的情况下,max−min<5max-min<5max−min<5成立,则一定是顺子代码 public boolean isStraight(int[] nums) {原创 2020-06-18 21:12:48 · 537 阅读 · 0 评论 -
面试题66. 构建乘积数组 表格法
题目描述给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B 中的元素 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。示例:输入: [1,2,3,4,5]输出: [120,60,40,30,24]提示:所有元素乘积之和不会溢出 32 位整数a.length <= 100000方法1.暴力法思路针对每个数组中每个位置的值,用一个循环遍历累乘,得出结果。时间复杂度O(n^2)代码 p原创 2020-06-01 11:24:22 · 144 阅读 · 0 评论 -
面试题53 - II. 0~n-1中缺失的数字
题目描述一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 1:输入: [0,1,3]输出: 2示例 2:输入: [0,1,2,3,4,5,6,7,9]输出: 8来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明原创 2020-05-28 11:13:52 · 225 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表 递归法
1.题目输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]2.解法2.1 栈 public int[] reversePrint(ListNode head) { ArrayDeque<Integer> stack = new ArrayDeque<>(); while(head!=null){ stack.addLas原创 2020-07-07 09:47:17 · 138 阅读 · 0 评论 -
面试题45. 把数组排成最小的数 暴力dfs法+排序法
题目描述输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: “102”示例 2:输入: [3,30,34,5,9]输出: “3033459”来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。方法1解题思路原创 2020-06-10 22:03:37 · 159 阅读 · 0 评论 -
面试题33. 二叉搜索树的后序遍历序列 递归法
面试题33. 二叉搜索树的后序遍历序列https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/方法1 递归法思路采用先序遍历(自顶向下的方式),分解原问题。本题的关键点在于,如果划分左、右子树和根节点。由于题目假定数组为后序遍历,存在如下规律:最后一个节点必为根节点区间从左到右,第一个大于根节点的值为右子树的根节点。以上述两点可以划分左、右子树和根节点。依据左、右子树不断的递归求原创 2020-05-20 22:41:39 · 148 阅读 · 0 评论 -
二叉搜索树的最近公共祖先 java
面试题68 - I. 二叉搜索树的最近公共祖先https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/思路树结构的题目,应该首先想到递归解法。题目比较难得地方在于如果判断某个节点是否为给定两节点的公共祖先。难点在于找出其中规律,对于某个节点来说,分成四种情况:p,q节点在root的右子树,并且p,q不等于root。此时公共祖先必在root的右子树中p,q节点在root的左子树,并且原创 2020-05-18 23:12:27 · 225 阅读 · 0 评论 -
面试题54. 二叉搜索树的第k大节点
题目描述给定一棵二叉搜索树,请找出其中第k大的节点。示例 1:输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2输出: 4示例 2:输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1输出: 4限制:1 ≤ k ≤ 二叉搜索树元素个数来源:力扣(LeetCode)链接:https:/原创 2020-05-16 13:49:32 · 129 阅读 · 0 评论 -
树的子结构+二叉树的镜像
参考链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/solution/mian-shi-ti-28-dui-cheng-de-er-cha-shu-di-gui-qing/1.面试题26. 树的子结构输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A: 3 / \ 4 5 / \原创 2020-05-15 10:21:04 · 144 阅读 · 0 评论 -
面试题32 - III. 从上到下打印二叉树 III
题目描述请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [20,9], [15,7]]提示:节点总数 <= 1000方法层次遍历+逆序思路先使用层次遍历的方法,将每一层的原创 2020-05-11 00:39:31 · 143 阅读 · 0 评论 -
面试题63. 股票的最大利润 一次循环+dp法
题目描述假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。示例 2:输入: [7,6,4,3,...原创 2020-05-08 01:01:06 · 235 阅读 · 0 评论