![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
文卿的藏剑山庄
这个作者很懒,什么都没留下…
展开
-
剑指 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。请问该机器人能够到达多少个格子?示例 1:输入:m = 2, n = 3, k = 1输出:3示例 2:输入:m = 3原创 2020-11-19 17:30:59 · 85 阅读 · 0 评论 -
剑指 Offer 38. 字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = “abc”输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]来源:力扣(LeetCode)用dfs+回溯的方法。本题要注意的一个地方就是可能会有重复的元素,不能重复计数,解决的办法是每次固定一个元素向下遍历的时候维护一个HashSet,一旦发现了重复元素就剪枝。class Solution { List<String>原创 2020-11-18 21:59:30 · 89 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 :输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”来源:力扣(LeetCode)思路:动态规划用dp[i]来表示前i个数字的翻译方法数。如果只翻译自己,比如对于原创 2020-11-14 16:46:07 · 76 阅读 · 0 评论 -
剑指 Offer 47. 礼物的最大价值
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?来源:力扣(LeetCode)简单直接的二维dp:class Solution { public int maxValue(int[][] grid) { int m=grid.length; int n=grid[0].原创 2020-11-14 14:45:21 · 99 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { if(headA==null || headB==null) return null; ListNode A=headA,B=headB; while(A!=B){ if(A!=null){原创 2020-11-14 14:24:04 · 66 阅读 · 0 评论 -
剑指 Offer 68 二叉树的最近公共祖先
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root==null) return null; if(root.val>p.val && root.val原创 2020-11-14 13:39:23 · 67 阅读 · 0 评论 -
剑指 Offer 42. 连续子数组的最大和
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。来源:力扣(LeetCode)简单易懂的动态规划代码:class Solution { public int maxSubArray(int[] nums) { int max=nums[0],sum=0;原创 2020-11-04 23:35:31 · 57 阅读 · 0 评论 -
剑指 Offer 58 - 翻转字符串
剑指 Offer 58 - I. 翻转单词顺序输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例 1:输入: “the sky is blue”输出: “blue is sky the”示例 2:输入: " hello world! "输出: “world! hello”解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后原创 2020-11-04 16:12:50 · 84 阅读 · 0 评论 -
剑指 Offer 57 - II. 和为s的连续正数序列
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]]来源:力扣(LeetCode)双指针的方法,如果两个指针之间的数字加起来比target小,就向后移动右指针,如果加起来比target大,就向后移动左指针,直至两原创 2020-11-04 14:35:22 · 49 阅读 · 0 评论 -
剑指 Offer 57. 和为s的两个数字
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例 1:输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]示例 2:输入:nums = [10,26,30,31,47,60], target = 40输出:[10,30] 或者 [30,10]来源:力扣(LeetCode)class Solution { public int[] twoSum(int原创 2020-11-04 12:13:45 · 167 阅读 · 0 评论 -
剑指 Offer 56 - 数组中数字出现的次数
剑指 Offer 56 - I. 数组中数字出现的次数一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]示例 2:输入:nums = [1,2,10,4,1,4,3,3]输出:[2,10] 或 [10,2]来源:力扣(LeetCode)思路:如果把题目改成“一个数组中除了一个数字之外,其他数字都出现了两次”原创 2020-11-03 21:12:42 · 61 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点
给定一棵二叉搜索树,请找出其中第k大的节点。思路:中序遍历递归解法:class Solution { public int kthLargest(TreeNode root, int k) { List<Integer> res=new ArrayList<Integer>(); inorder(root,res); return res.get(res.size()-k); } public void i原创 2020-11-03 17:05:16 · 78 阅读 · 0 评论 -
剑指 Offer 53 - 在排序数组中查找数字
剑指 Offer 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来源:力扣(LeetCode)最简单的遍历方法:class Solution { public int search(int[] nums, int target) { for(原创 2020-11-03 16:23:42 · 69 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。来源:力扣(LeetCode)一不小心写出了最标准的正确解法:class Solution { public boolean isSymmetric(TreeNode root) { if(root==null) return true; return isSym(root.left,root.right); }原创 2020-10-27 16:50:33 · 42 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像
请完成一个函数,输入一个二叉树,该函数输出它的镜像。来源:力扣(LeetCode)思路:先判断是否是空,然后交换,最后递归class Solution { public TreeNode mirrorTree(TreeNode root) { if(root==null) return null; if(root.left==null && root.right==null) return roo原创 2020-10-27 16:48:33 · 149 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。来源:力扣(LeetCode)注意第一个isSubStructure是从头开始判断的,因此如果B是空就要返回false而第二个isSubStructure2是在已经有根节点相同的前提下进行的判断,此时如果B是空就返回trueclass Solution { public boolean isSubStructure(TreeNode A, TreeNode原创 2020-10-26 19:41:52 · 52 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.来源:力扣(LeetCode)两次遍历的方法:class Solution { public ListNode getKthFromEn原创 2020-10-26 13:27:47 · 55 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确的答案之一。来源:力扣(LeetCode)双指针:class Solution { public int[] exchange(int[] nums) { int left=0,right=nums.length-1; while(lef原创 2020-10-26 13:11:43 · 72 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,"c",“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格原创 2020-10-15 19:55:38 · 58 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0来源:力扣(LeetCode)最直观的算法class Solution { public int minArray(int[] numbers) {原创 2020-10-15 16:29:16 · 57 阅读 · 0 评论 -
剑指 Offer 24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL来源:力扣(LeetCode)class Solution { public ListNode reverseList(ListNode head) { ListNode temp=null,nextNode=null; whi原创 2020-10-14 16:11:17 · 51 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4来源:力扣(LeetCode)自己写的递归代码:class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1==null) return原创 2020-10-14 15:57:06 · 42 阅读 · 0 评论 -
剑指 Offer 32. 层次遍历二叉树
32-1从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印,以数组的形式返回。class Solution { public int[] levelOrder(TreeNode root) { if(root==null) return new int[0]; Queue<TreeNode> q=new LinkedList<>(); Queue<Integer> res=new LinkedLi原创 2020-10-14 15:14:25 · 65 阅读 · 0 评论 -
剑指 Offer 31. 栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2), push(3), push(4原创 2020-10-14 15:07:22 · 56 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]来源:力扣(LeetCode)自己写的一个递归,从前向后调用,从后向前赋值。class Solution { public int[] reversePrint(ListNode head) { ListNode cur=head; int len=0; while(cur!=null){原创 2020-10-13 22:22:35 · 59 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = “We are happy.”输出:“We%20are%20happy.”来源:力扣(LeetCode)class Solution { public String replaceSpace(String s) { int length=s.length(); char[] arr=new char[length*3]; int size=0;原创 2020-10-13 21:55:55 · 52 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]]给定 target = 5,返回 true。给定 targ原创 2020-10-13 20:48:39 · 44 阅读 · 0 评论 -
剑指 Offer 10.斐波那契数列
10-1写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。来源:力扣(LeetCode)class Solution { public int原创 2020-10-12 21:30:27 · 195 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3来源:力扣(LeetCode)最容易想到的:class Solution { public int findRepeatNumber(int[] nums) { HashMap<I原创 2020-10-12 20:49:53 · 70 阅读 · 0 评论