剑指offer
不蛋定
这个作者很懒,什么都没留下…
展开
-
leetcode-剑指offer-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解题思路排序数组的搜索首先考虑二分查找如果左边下标和元素能对应上,说明往左都有序。左边指针移动如果右边对应不上,说明右边乱序,右边指针向左移动,寻找第一个乱序的下标,即为所有元素代码实现func mi原创 2021-07-27 15:20:10 · 173 阅读 · 0 评论 -
leetcode-剑指offer-58:反转单词顺序
题目描述输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例 1:输入: “the sky is blue”输出: “blue is sky the”示例 2:输入: " hello world! "输出: “world! hello”解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入: “a原创 2021-07-15 00:05:25 · 212 阅读 · 1 评论 -
leetcode-剑指offer-65:二进制实现加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。示例:输入: a = 1, b = 1输出: 2解题思路使用二进制s = a + b = n + c;c为进位和,n为非进位和异或操作可得到非进位和,相与并左移一位可得到进位和代码实现func add(a int, b int) int { // 进位为0跳出循环 for b != 0 { // 进位和 c := (a &原创 2021-07-14 23:36:11 · 192 阅读 · 0 评论 -
leetcode-剑指offer-53: 在排序数组中查找数字 I
题目描述统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0解题思路二分查找。通过处理等于的情况,查找左右边界,下边相减即为出现次数右边界:等于的时候,左指针继续向右移左边界:等于的时候,右指针继续向左移左右都会超出目标值一位,最后结果要减去一代码实现func search(nums []int, tar原创 2021-07-14 02:11:39 · 111 阅读 · 0 评论 -
leetcode-剑指offer-52:两个链表的第一个公共节点
题目描述输入两个链表,找出它们的第一个公共节点。解题思路双指针法。a走完再走b,b走完再走a,这样两个链表所走一样长,且在第一个公共节点停止代码实现/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */func getIntersectionNode(headA, headB *ListNode) *ListNode原创 2021-07-12 13:20:49 · 97 阅读 · 0 评论 -
leetcode-剑指offer-50:第一个只出现一次的字符
题目描述在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例:s = “abaccdeff”返回 “b”s = “”返回 " "解题思路用数组记录每个字符出现的次数寻找只出现过一次的字符返回算法复杂度时间复杂度 O(N)空间复杂度 O(1)代码实现func firstUniqChar(s string) byte { count := make([]int, 26) for _, c := range s {原创 2021-07-12 12:57:17 · 106 阅读 · 0 评论 -
leetcode-剑指offer-42:连续子数组的最大和
题目描述解题思路动态规划如果前边值对当前为负增益,舍弃。如果为增益,加上一直记录dp数组中的最大值,遍历完即可得到连续子数组的最大和可以用原数组来维护dp数组算法复杂度时间复杂度:O(N)空间复杂度:O(1)代码实现func maxSubArray(nums []int) int { if len(nums) <= 0 { return 0 } res := nums[0] for i := 1; i < len(nu原创 2021-07-12 12:38:29 · 128 阅读 · 0 评论 -
leetcode-剑指offer-40:最小的k个数
题目描述输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 1:输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]示例 2:输入:arr = [0,1,2,1], k = 1输出:[0]方法一:快排解题思路快排,找基准。然后从右边找一个比基准大的,从左边找一个比基准小的。交换。基准和小的交换。这样就将数组以基准分为两部分,递归处理这两部分(分治)注意先从右边找,再从原创 2021-07-12 01:18:35 · 175 阅读 · 0 评论 -
leetcode-剑指offer-39:数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2解题思路投票法随机假设一个众数,遍历数组,如果和众数相同,则加一票,不同则减一票因为该数组出现次数超过一半以上,因此最终投票留下的众数就是该数代码实现func majorityElement(nums []int) int { // 假设的众数 x := 0原创 2021-07-11 16:26:19 · 108 阅读 · 0 评论 -
leetcode-剑指offer-29:顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]解题思路定义上下左右四个边界,按顺序循环打印注意判断结束条件,四个边界某两个相遇时即结束代码实现func spiralOr原创 2021-07-11 15:56:45 · 126 阅读 · 0 评论 -
leetcode-剑指offer-32-II:从上到下打印二叉树 II
题目描述从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如:给定二叉树: [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回其层次遍历结果:[[3],[9,20],[15,7]]解题思路利用队列进行层序遍历每层再进行遍历,一次处理一层数据。将结果保存在二维数组中,将子节点添加进队列代码实现/** * Definition for a binary tree node. * type TreeNo原创 2021-07-11 15:20:33 · 143 阅读 · 0 评论 -
leetcode-剑指offer-30:最小栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。解题思路使用两个栈来实现一个栈正常保存数值,入栈出栈另一个栈保存当前栈内最小值,入栈时将当前最小值和入栈元素比较,小者入栈出栈时两个栈同时出栈代码实现type MinStack struct { stack []int minStack []int}/** initialize your data struc原创 2021-07-11 14:12:10 · 111 阅读 · 0 评论 -
leetcode-剑指offer-28:对称的二叉树
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1/ 2 2/ \ / 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1/ 2 2\ 3 3示例 1:输入:root = [1,2,2,3,4,4,3]输出:true示例 2:输入:root = [1,2,2,null,3,null,3]输出:f原创 2021-07-11 13:49:45 · 98 阅读 · 0 评论 -
leetcode-剑指offer-27:二叉树的镜像
题目描述请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入:4/ 2 7/ \ / 1 3 6 9镜像输出:4/ 7 2/ \ / 9 6 3 1示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]方法一:递归解题思路处理当前节点,交换左右子节点递归分别处理左子树和右子树代码实现/** * Definition for a binary tree node.原创 2021-07-11 13:39:09 · 147 阅读 · 0 评论 -
leetcode-剑指offer-25:合并两个有序链表
题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4解题思路新建一个链表头遍历两个链表,直到某个到头。按大小将两个链表的节点添加在新链表之后遍历完,检查两个链表剩余的元素代码实现/** * Definition for singly-linked list. * type ListNode struct { *原创 2021-07-10 15:42:20 · 122 阅读 · 0 评论 -
leetcode-剑指offer-24:反转链表
题目描述定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL方法一:迭代解题思路利用链表的头插法挨着遍历原链表,头插到新链表代码实现/** * Definition for singly-linked list. * type ListNode struct { * Val int *原创 2021-07-10 15:31:48 · 249 阅读 · 0 评论 -
leetcode-剑指offer-22:链表中倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5解题思路双指针法复制一个链表出来,第一个链表走k个节点然后两个链表一起开始走,直到第一个链表走完此时第二个链表当前节点原创 2021-07-10 15:14:55 · 212 阅读 · 0 评论 -
leetcode-剑指offer-21: 调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确的答案之一。解题思路双指针法,头尾各一个指针头指针寻到奇数则继续,直到偶数尾指针寻到偶数则继续,直到奇数头偶尾奇交换,然后继续直到头尾指针相遇代码实现func exchange(nums []int) []int { left := 0 ri原创 2021-07-10 15:04:59 · 55 阅读 · 0 评论 -
leetcode-剑指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 的第三个节点,那么在调用了你的函数原创 2021-07-10 14:43:30 · 121 阅读 · 0 评论 -
leetcode-剑指offer-17:打印从1到最大的n位数
题目描述输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]解题思路不考虑大数的情况最大的n位数等于10的n次方减一然后遍历打印即可代码实现func printNumbers(n int) []int { res := make([]int, 0) max := 1 for i := 0; i < n; i原创 2021-07-09 16:03:00 · 131 阅读 · 0 评论 -
leetcode-剑指offer-15:二进制中1的个数
题目描述编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。方法一:位运算解题思路遍历,右移,如果最后一位是1,计数加一代码实现func hammingWeight(num uint32) int { res := 0 for i := 0; i <= 32; i++ { if (num&1) == 1 { res++ }原创 2021-07-09 15:37:14 · 150 阅读 · 0 评论 -
leetcode-剑指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方法一:遍历算法复杂度O(N)解题思路遍历数组,当前元素如果小于下一个元素,继续遍历当前元素如果大于下一个元素,则下一个元素就是最小值遍历完还没有找到,则返回第一原创 2021-07-09 15:19:59 · 65 阅读 · 0 评论 -
leetcode-剑指offer-62:约瑟夫环
题目描述0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入: n = 5, m = 3输出: 3示例 2:输入: n = 10, m = 17输出: 2方法一:暴力解解题思路维护链表,迭代进行删除,直至最后一个节点注意迭代原创 2021-06-18 17:23:13 · 408 阅读 · 0 评论 -
leetcode-剑指offer-11:青蛙跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。解题思路同斐波那契数列,每次n都等于n-1 + n-2需要注意初始值不同代码实现func numWays(n int) int { if n == 0 { return 1 } if n == 1 || n == 2 { retu原创 2021-05-23 17:49:04 · 82 阅读 · 0 评论 -
leetcode-剑指offer-10:斐波那契数列
题目描述写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。解题思路用递归在leetcode会超时采用动态规划思想,没明白怎么就动态原创 2021-05-23 17:37:21 · 103 阅读 · 0 评论 -
leetcode-剑指offer-07:重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。解题思路前序遍历的第一个值为根结点,在中序遍历中找到该值的下标中序遍历该值左边为根结点左子树,右边为根结点右子树前序遍历从第一个节点往后数 与中序遍历左子树相同个数的节点,为左子树本轮分析得到根结点,以及左子树,右子树的值递归即可得到整个树代码实现/** * Definition for a binary tree node. * type TreeNode str原创 2021-05-23 17:18:51 · 209 阅读 · 0 评论 -
leetcode-剑指offer-09:用两个栈实现队列
题目描述剑指 Offer 09. 用两个栈实现队列解题思路用切片当作栈入队列用栈一,出队列用栈二出队列没有数据时将栈一整个入栈到栈二经过两次入栈出栈,其顺序刚好符合队列先进后出的特点代码实现type CQueue struct { stack1 []int stack2 []int}func Constructor() CQueue { return CQueue{}}func (this *CQueue) AppendTail(value int原创 2021-05-23 16:53:36 · 100 阅读 · 0 评论 -
leetcode-剑指offer-04:二维数组中的查找
题目描述在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路暴力法直接双重for循环二维数组有序,从右上角观察,像一颗二叉搜索树从右上角开始,大于目标值,向左移,小于目标值,向下移注意:判断边界条件;列值可以小到0代码实现func findNumberIn2DArray(matrix [][]int, target int) bool {原创 2021-05-23 15:42:31 · 118 阅读 · 0 评论 -
leetcode-剑指offer-03:数组中重复的数组
题目描述在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3方法一:map哈希法解题思路遍历数组,检查map中是否存在,已存在则返回该数。不存在则存入map,继续遍历代码实现func findRepeatNumber(nums []int) int { numMap :原创 2021-02-21 14:37:08 · 101 阅读 · 0 评论 -
剑指offer-20:最小栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。解题思路空间换时间,用两个栈来实现第一个栈正常保存元素第二个栈为最小栈,入栈是判断如果入栈元素小于最小栈栈顶元素,则将该元素入栈,否则入栈栈顶元素始终保证与该元素同位置的最小栈元素为当前栈内最小元素的值出栈时两个栈均需pop代码实现import java.util.Stack;public class Solution { Stack<Integer>原创 2020-11-18 00:00:00 · 114 阅读 · 0 评论 -
剑指offer-17:树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路从根节点开始,判断值是否相同如果不同则分别用A树的左右孩子节点与B树的根节点比较没有则直接返回如果找到值相同的,则调用辅助方法递归判断A树的左右孩子和B树的左右孩子是否相等直到B树为空,则返回true,否则回溯,继续寻找A树的与B跟节点值相同的孩子直到A树为空,则返回false注意边界判断。空树不是任意一个树的子结构代码实现/**public class TreeNode {原创 2020-11-04 23:53:06 · 686 阅读 · 0 评论 -
剑指offer-16:合并两个有序链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路判断两个链表是否为空新建一个链表遍历两个链表,小的插进新链表,往后移一个节点,新链表移一个节点当一个链表为空时,判断两个链表是否为空,将剩余节点插入新链表后边代码实现/*/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.va原创 2020-11-04 00:35:35 · 92 阅读 · 0 评论 -
剑指offer-15:反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。思路分析头插法遍历链表保存当前节点的下一个节点将新链表插入当前节点的后边再将当前节点赋值给新链表表头节点将链表的头指向保存的下一个节点代码实现/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution原创 2020-10-28 22:40:33 · 96 阅读 · 0 评论 -
剑指offer-14:链表中倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路两个头指针第一个先走到k然后一起走,第一个走完时,第二个指向倒数第k个节点代码实现/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode FindKthT原创 2020-10-27 23:25:51 · 68 阅读 · 0 评论 -
剑指offer-13:调整数组的顺序
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路分析用空间换时间用两个数组分别存储奇数和偶数再将两个数组合并写回原数组代码实现public class Solution { public void reOrderArray(int [] array) { int length = array.length; int[]原创 2020-10-26 23:14:29 · 52 阅读 · 0 评论 -
剑指offer-12:数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0思路分析注意边界判断如果为0,则直接返回如果指数为负数,则需要以base做为分母进行计算代码实现public class Solution { public double Power(double base, int exponent) { double res = 1; if (expone原创 2020-10-26 22:33:28 · 110 阅读 · 0 评论 -
剑指offer-11:二进制中1的个数
题目描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。思路分析如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都原创 2020-10-20 22:57:01 · 75 阅读 · 0 评论 -
剑指offer-10:矩阵覆盖
题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:解题思路该题同斐波那契数列第n项等于前一项放1块的可能加上前一项放2块的可能代码实现public class Solution { public int RectCover(int target) { if (target <= 0) { return 0;原创 2020-10-20 22:44:42 · 67 阅读 · 1 评论 -
剑指offer-09:变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路跳一级,剩下的跳法是f(n - 1)种跳两级,剩下的跳法是f(n - 2)种跳n级,剩下的跳法是f(n) =f(n - 1) + f(n - 2) + … + f(2) + f(1)则跳n级需要的次数是f(n) =f(n - 1) + f(n - 2) + … + f(2) + f(1) + 1因为f(n - 1) = f(n - 2) + … + f(2) + f(原创 2020-10-19 23:13:26 · 101 阅读 · 0 评论 -
剑指offer-08:跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解题思路如果只有一节台阶,则只有一种结果两节台阶有两种结果再往后以此类推该次次数等于上一次跳一节的之前的次数,加上上一节跳两节的之前的所有次数之和代码实现public class Solution { public int JumpFloor(int target) { if (target <= 0) {原创 2020-10-19 22:47:48 · 68 阅读 · 0 评论