自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 剑指Offer.58-I 翻转单词顺序

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”解题思路将字符串以空格分割成字符串数组倒序遍历数组, 拼接每个单词代码class Solution { public String reverseWords(String s) { String[] words = s.trim().split(" "); Stri

2020-09-30 20:48:32 78

原创 剑指Offer.57-II 和为s的连续正整数序列

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列解题思路用一个滑动窗口, 两个指针i, j一左一右计算两个指针范围内所有数之和计算和:一开始先i = 1, j = 2, sum = 1 + 2判断sum与target的关系如果等于, 则将序列添加到结果集, 并且sum += ++j(这里注意是++j, 因为下一轮窗口往右拓展, 需要加上j + 1)如果小于, 则也是窗口往右拓展su

2020-09-30 18:43:10 71

原创 剑指Offer.57 和为s的两个数字

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可解题思路两个指针, 指向两端, 计算当前所指两个数字之和如果等于直接返回如果小于, 则把左索引右移如果大于, 则把右索引左移代码class Solution { public int[] twoSum(int[] nums, int target) { int len = nums.length; if (len < 2) {

2020-09-30 14:26:27 43

原创 剑指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]解题思路如果数组中只有一个只出现一次的数字, 其余都是出现两次那么整个数组的数字异或得到的结果就是这个数字因为成对出现的数字异或会变成0如果数组中有两个只出现一次

2020-09-30 13:54:11 92

原创 剑指Offer.55-II 平衡二叉树的深度

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。示例 1:给定二叉树 [3,9,20,null,null,15,7]3/ 9 20/ 15 7返回 true解题思路树的深度depth(root) = max(depth(root.left), depth(root.right)) + 1是否平衡 = 左右子树深度差 < 2 且 左子树是平衡的 且 右子树是平衡的代码class Soluti

2020-09-29 17:38:38 121

原创 剑指Offer.55-I 二叉树的深度

输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例如:给定二叉树 [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回它的最大深度 3 。解题思路每一个节点的深度 = max(左子树深度, 右子树深度) + 1depth(root) = max(depth(root.left), depth(root.right)) + 1代码/** * Definition

2020-09-29 17:07:32 48

原创 剑指Offer.54 二叉搜索树的第K大节点

给定一棵二叉搜索树,请找出其中第k大的节点解题思路借助深度遍历(右-根-左)的顺序遍历二叉搜索树, 就能按照从大到小的顺序遍历这棵树只要做好计数就可以了代码class Solution { int count = 0; int result = 0; public int kthLargest(TreeNode root, int k) { depthTravel(root, k); return result; }

2020-09-29 16:50:01 30

原创 剑指Offer.53-II 在排序数组查找数字

一个长度为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解题思路因为数组有序, 所以借助二分法找出缺失的数字, 其实也就是找出有序数组中第一个索引与值不相等的元素使用两个索引, 一左一右i, j当i <= j时循环判断中位数num[(i + j) / 2]是否索引

2020-09-29 16:23:34 89

原创 剑指Offer.53-I 在排序数组查找数字

解题思路由于数组有序, 可以借助二分法, 找出,目标数字的右边界, 再找出(目标数字 - 1)的右边界两个边界相减就是目标数字的个数找出右边界:两个索引i, j, 一左一右当 i <= j 时循环判断中位数nums[(i + j) / 2]是否 <= 目标数是则目标数右边界在中位数右边, 更新左索引 i = m + 1否则更新右索引 j = m - 1最后返回 i代码class Solution { public int search(int[] n

2020-09-29 15:41:25 56

原创 剑指Offer.52 两个链表的第一个公共节点

输入两个链表,找出它们的第一个公共节点解题思路用两个指针分别指向两个头节点, 只要两个指针不相等就分别往后迭代, 走到尽头就换到另一个链表头继续迭代当两个指针相遇时就是第一个公共节点当两个链表没有交集时, 两个指针会同时等于null, 也会跳出循环代码public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode a = headA

2020-09-29 14:37:39 36

原创 剑指Offer.50 第一个只出现一次的字符

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母解题思路ASCII码一共256个, 用数组保存字符出现的次数遍历字符, 更新数组中记录的次数再次遍历, 返回次数为1的字符代码class Solution { public char firstUniqChar(String s) { // ASCII码一共256个, 用数组保存字符出现的次数 int[] count = new int[256]; c

2020-09-29 13:51:37 101

原创 剑指Offer.48 最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度解题思路两个索引(i, j), 一左一右, 一个存放<字符, 索引>的map先移动右索引j, 将遍历到的字符和j存入map, 并保留最长的长度作为结果result = Math.max(result, j - i)当map中已有j索引对应字符时, 说明遇到重复字符, 需要更新左索引i的位置i = Math.max(map.get(ch), i)代码class Solution { public int

2020-09-28 23:22:55 58

原创 剑指Offer.46 把数字翻译成字符串

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”解题思路动态规划: 如果最后两个数字能翻译成字符, f(n) = f(n - 1) + f(n - 2)如果最后两

2020-09-28 20:59:23 39

原创 剑指Offer.47 礼物的最大价值

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例 1:输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物解题思路动态规划: f(i, j) = MAX(f(i, j - 1), f(i - 1, j)) + grid

2020-09-28 18:55:24 34

原创 剑指Offer.42 连续子数组的最大和

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6解题思路动态规划: 将数组的元素更新为从首元素到当前元素的连续子数组最大和代码class Solution { public int maxSubArray(int[] nums) { int result = nums[0]; // 动

2020-09-28 18:25:58 30

原创 剑指Offer.39 数组中出现次数过半的数

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字解题思路摩尔投票, 先假定一个众数, 然后遍历数组, 遇到众数票数+1, 非众数票数-1票数为0时更换众数为刚好遍历的数字, 最后被选上的数一定出现次数过半代码class Solution { public int majorityElement(int[] nums) { int mode = nums[0]; // 众数 int vote = 0; for (int num :

2020-09-28 11:11:14 56

原创 剑指Offer.37 序列化二叉树

请实现两个函数,分别用来序列化和反序列化二叉树。示例:  将以下二叉树:1/ 2 3/ 4 5序列化为 “[1,2,3,null,null,4,5]”解题思路序列化: 利用队列和广度遍历, 节点不为空则拼接值到字符串, 空则拼接null反序列化: 将字符串去头去尾, 以","分割成字符串数组, 借助队列, 扫描数组, 如果元素不是"null"则添加子节点代码/** * Definition for a binary tree node. * public cla

2020-09-27 23:41:20 37

原创 剑指Offer.36 二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表要求不能创建任何新的节点,只能调整树中节点指针的指向解题思路中序遍历二叉树, 遍历每个节点的时候, 用变量保存好头节点, 当前节点的上一节点, 尾节点将当前节点的left指向前一节点, 上一节点的right指向当前节点最后头节点和尾节点需要互指(头.left = 尾, 尾.right = 头)代码/*// Definition for a Node.class Node { public int val; pub

2020-09-27 20:21:38 214

原创 剑指Offer.35 复杂链表的复制

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null解题思路用HashMap保存<当前节点, 复制的当前节点>遍历原有链表, 复制所有节点, 通过HashMap建立源节点和复制后的节点的联系然后再次遍历原链表, 将原来节点的next和random的关系也复制给新节点代码/*// Definition for a Node.class Node {

2020-09-27 18:45:10 54

原创 剑指Offer.34 二叉树中和为某一值的路径

输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径从树的根节点开始往下一直到叶节点所经过的节点形成一条路径解题思路用一个栈保存经过的路径, 一个临时变量保存当前的和遍历一个节点时, 将该节点压入栈, 并取出值加到临时变量当遍历到叶节点时, 判断临时变量是否等于指定值, 是则将栈作为整体加入结果集代码class Solution { List<List<Integer>> result = new LinkedList<>();

2020-09-25 15:43:56 29

原创 剑指Offer.33 二叉搜索树的后序遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同解题思路后序遍历的最后一个节点是根节点, 从头到尾扫描序列、借助搜索树的特性比较与根节点的大小, 如果满足后序遍历, 则可以将除根节点之外的元素分成两部分一部分为左子树, 另一部分右子树然后再分别判断左子树和右子树满不满足后序遍历代码class Solution { public boolean verifyPostorder(int[]

2020-09-25 00:49:18 55

原创 剑指Offer.31栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof解题思路扫描数组pushed, 并用一个索引指向

2020-09-24 19:00:05 36

原创 剑指Offer.30 包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)解题思路需要两个栈, 一个保存数据, 一个保存每一次将元素压入栈后的当前最小值压入元素时, dataStack正常压入, minStack则压入要压入的元素和minStack栈顶之间的最小值Math.min(x, minStack.element())弹出元素则两个栈都正常弹出得到栈的最小值则只需要查看minStack的栈顶元素即可代码class M

2020-09-24 16:21:33 70

原创 剑指Offer.29 顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字解题思路分析打印矩阵的每一圈的规律, 用循环语句打印每一圈打印的第一个数的索引是(0, 0), (1, 1), (2, 2)…观察第一个数的索引和行数列数之间的关系, 可以知道当 start * 2 < rows && start * 2 < cols也就是第一个数索引的两倍小于行数和列数时, 还有剩余的"内圈"要打印接下来是解决打印数字的函数 print(int[][] matrix, int start

2020-09-23 19:49:47 43

原创 剑指Offer.28 对称的二叉树

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的解题思路借助遍历, 同一个二叉树, 一边以"先左后右"遍历, 一边以"先右后左"遍历当两边遍历情况一致时, 该树是对称的遍历时, 两边节点都为空时无法判断, 返回真(最终结果是"与", 所以返回真不影响)当只有一个为空时明显不是对称的, 返回false当节点值不相等时返回false递归调用isSymmetric(a.left, b.right) && isSymmetric(a.righ

2020-09-23 18:12:29 38

原创 剑指Offer.24 反转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof解题思路如果只有一个节点, 返回头节点即可不止一个节点时, 需要三个索引, 遍历时, 一个指向(原顺序的)上一个节点、

2020-09-22 14:35:28 35

原创 剑指Offer.21 调整数组顺序使奇数在偶数前

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分示例:输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确的答案来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof解题思路在数组左右定义两个索引,

2020-09-22 13:52:51 43

原创 剑指Offer.27 二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出它的镜像。示例:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof解题思路广度遍历二叉树, 把每个节点的左右子节点交换广度遍历:用一个队列或栈, 现将根节点加入队列, 然后只要队列不为空就循环执行如下操作将队首弹出, 判断左右子树是否为空, 不为空则加入

2020-09-16 18:38:43 39

原创 剑指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)链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-

2020-09-16 18:02:13 71

原创 剑指Offer.18 删除链表的节点

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。注意:此题对比原题有改动示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:输入: head = [4,5,1,9], val = 1输出: [4,5,9]解释: 给定你链表中值为 1 的第

2020-09-16 17:33:23 43

原创 剑指Offer.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://leetc

2020-09-16 01:13:22 38

原创 剑指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)链接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof

2020-09-15 23:24:09 74

原创 剑指Offer.8 二叉树的下一个节点

找出"中序遍历"时二叉树的下一个节点解题思路中序遍历即是"左根右"的顺序遍历,考虑几种情况如果当前节点有右子树, 则下一节点为右子树的最左的节点如果当前节点没有右子树且没有父节点,则该节点已是中序遍历的最后节点有父节点且是父节点的左子节点,则该父节点是遍历的下一个节点且是父节点的右子节点,则需要往上找到第一个是它父节点的左子节点的节点,并返回父节点有可能往上找到一个没有父节点的节点,此时中序遍历也已结束代码class Node { Node parent;

2020-09-14 20:16:06 48

原创 剑指offer.10-I 斐波那契数列

写一个函数,输入 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解题思路由题可知, n <= 1时直接返回n即可n >= 2

2020-09-14 12:46:47 78 1

原创 剑指Offer.9 用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )解题思路准备两个栈, 称为a和b, 加元素的时候加进a, 删除元素时要考虑情况假如a中已经有了几个元素, 而b中没有元素此时想要删除元素并且满足队列的特性, 只需要把a中的元素逐个弹出压入到b b.push(a.pop()), 直到a为空此时b中元素的顺序和之前的a就是

2020-09-14 12:19:05 29

原创 剑指Offer.5 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = “We are happy.”输出:“We%20are%20happy.”来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof解题思路先扫描一边字符串, 统计出空格个数然后定义一个字符数组, 长度为(原字符串长度 + 2 * 空格数), 因为一个空格换成"%20", 一变三, 每个空格使新字符串长度增加2然后定义两个索

2020-09-09 20:34:26 63

原创 LeetCode.1 两数之和

题目给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍示例给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/

2020-09-08 23:44:14 69

原创 剑指Offer.4 二维数组中的查找

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数来源:《剑指Offer》解题思路由于矩阵本身是左小右大, 上小下大, 所以如果先从最右上角的数字开始比较int i = 0; int j = matrix[0].length - 1;如果该数等于目标数, 直接返回如果该数小于目标数, 由"左小右大"的特性, 该数所在行所有数都小于目标数, 则直接忽略该行, 将比较的数位置往下挪一行i

2020-09-08 23:43:29 63

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除