- 博客(39)
- 收藏
- 关注
原创 动态规划——硬币问题
动态规划——硬币问题/*题目描述:给定不同面额的硬币 coins 和一个总金额 amount,可以凑成总金额所需的最少的硬币个数。 *解体思路: * 动态规划: * coins={1、2、5} amount=11; * 确定状态:dp[i] 当前金额i需要dp[i]枚硬币组成 * 状态转移方程:dp[i]=min(dp[i-1],dp[i-2],dp[i-5]) 当前状态的前一个状态有三种可能选择最优解 * 记忆化递归: * 声明记忆哈希表 * 枚举当前金额的前一个状态的所有
2020-08-10 18:03:37 319 1
原创 LeetCode-236 二叉树最近公共祖先
LeetCode-236 二叉树最近公共祖先/* 236. 二叉树的最近公共祖先 * 题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 * 解体思路:分两部分解决 * 第一部分:实现判断两个结点包含于某根节点的子树内 * 第二部分:先序遍历二叉树,如果根节点的子树包含qp目标结点 * 传入左孩子,进行递归。传入右孩子,进行递归。 * 如果孩子的递归返回值为null,则返回根节点,如果孩子的递归结
2020-08-10 17:59:40 241
原创 二叉树第K层结点个数
二叉树第K层结点个数public class ErChaShuKCengJieDianGeShu { public static void main(String[] args) { TreeNode root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(3); root.left.left = new TreeNode(4); root.left.right = new Tr
2020-08-10 17:57:43 1083
原创 重建二叉树
重建二叉树/* 题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。 * 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 * 例如:前序遍历为12473568、中序遍历为47215386 * 前序遍历的第一个元素为数的根节点、中序遍历中根节点左边的为左子树右边的为右子树 * 前序:根节点(1)左子树(247)右子树(3568) * 中序:左子树(472)根节点(1)右子树(5368) * * 前序247、中序472
2020-08-10 17:34:37 131
原创 归并排序
归并排序/* 归并排序:将一个数组切分、切分,,,分到不可再分,然后两两合并,,,合并直到合并会大数组 * 合并的过程即合并俩个有序序列。 * 归并排序与快速排序的不同指出在于,快排的有序发生在切分过程,归并的有序发生在合并的过程。 * * */public class MergeSort { public static void main(String[] args) { int[] array = {5,8,10,12,7,13,15}; MergeSo
2020-08-10 17:30:53 132
原创 希尔排序
希尔排序/* 希尔排序:有数组arrary,取length/2为间隔(每轮迭代间隔折半), * 将array逻辑上划分为若干个子数组,对子数组进行插入排序 * */public class ShellSort { public static void main(String[] args) { int[] array = {20,10,8,5,15,13,40,18}; ShellSort sort = new ShellSort(); sort.shellSortSo
2020-08-10 17:29:55 121
原创 快速排序(Java)
快速排序/* 快速排序 * 原理:思想上来看就是每轮选定一个基准点,将小于基准点的元素放在基准点前 * 将大于基准点的元素放在基准点之后。不断的切分原有的区间,当每个区间 * 最小时,就保证了整个数列时有序的。 * 实现:快速排序的实现分为两部分,左小右大的简单排序以及递归切分区间。 * * */public class QuictSort { /* 默认选中0号元素为基准点,left为左边界初始指向array[1],right为右边界初始指向arra
2020-08-10 17:28:55 172
原创 简单选择排序(Java)
简单选择排序/* 简单选择排序:遍历无序数列,第i轮找出第i大的数放入第i个位置 * 时间复杂度:最坏情况外层循环每遍历一个,内层循环都要遍历i到array.length获取最小元素 * n+(n-1)+..+1 o(n**2) * 不稳定 * */public class SimpleSelectionSort { public static void main(String[] args) { //int[] array = {9,8,7,6,5,4,3,2,1};
2020-08-10 17:27:56 109
原创 直接插入排序(Java)
直接插入排序/* 直接插入排序:默认前k个元素有序,每次将第i个元素插入到k个有序元素的正确位置 * 从array[1]开始遍历数组(默认初始有序数列未{array[0]}) * 遍历区间从待插入的新元素array[i]遍历到array[0] * 如果待插入的元素与前一个元素无序则交换 * 时间复杂度:最坏情况外层循环每遍历1个,内层循环遍历i个,1+2+3+...+n o(n**2) * 稳定 * * */public class StraightInsertion
2020-08-10 17:26:23 108
原创 栈的压入弹出序列
栈的压入弹出序列/* 剑指offer31:栈的压入、弹出序列 * 题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。 * 假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列, * 序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列, * 但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。 * 解题思路: * 12345的入栈顺序是否能得到45321的出栈
2020-08-06 22:08:42 193
原创 用队列实现栈
用队列实现栈/* 225:用队列实现栈 * 题目描述:使用队列实现栈的下列操作:push(x) -- 元素 x 入栈,pop() -- 移除栈顶元素 top() -- 获取栈顶元素,empty() -- 返回栈是否为空。 解题思路:声明两个队列,queue、queue1、queue2(queue指向当前存有元素的栈) push:如果两个队列都空,将元素放入queue1,若有一个队列非空元素入该队列 top:将当前非空的队列弹出到空的队列,最后一个弹出的元素,出栈
2020-08-06 22:07:30 93
原创 包含min函数的栈
包含min函数的栈/* 剑指offer30:包含min函数的栈 * 题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中, * 调用 min、push 及 pop 的时间复杂度都是 O(1)。 * 解题思路:用链表模拟栈,push、pop时间复杂度就是O(1),维持一个指针指向栈内最小元素 * 使min的时间复杂度也是O(1). * (这种解题思路是错误的,因为只能通过min指针找到 * 曾经称为过最小值的
2020-08-06 22:06:16 78
原创 删除链表结点
删除链表结点/* 剑指offer18题:删除链表的节点 * 题目描述:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 * 返回删除后的链表的头节点。 * 解题思路:该题在剑指offer中的原题是,给定一个单链表的头指针、指定结点指针, * 要求以o(1)的时间复杂度删除该结点。解决方法为将待删除结点的后继结点的值 * 赋给待删除结点然后将待删除结点的后继指向其后继的后继,然后释放掉待删除 * 结点的原始后继。对于待删除结点没有后继结点
2020-08-06 22:04:44 175
原创 分割链表
分割链表/* 面试题 02.04 :分割链表 * 题目描述:编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。 * 如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。 * 分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。 * 解题思路:本题要求将大于基准的数置于结点左侧,小于结点的置于结点右侧,该功能类似于快速排序 * 的分割操作(基准指向0,left指向1、right指向leng
2020-08-06 22:03:07 140
原创 奇偶链表
奇偶链表/* 328. 奇偶链表 * 题目描述:给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。 * 请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。 * 要求:空间复杂度O(1),时间复杂度O(n) * 解题思路:声明指针记录第二个结点,游标遍历链表,将每个结点的后继指向后继的后继, * 将游标最后指向的结点的后继指向第二个结点 * 测试:null,只有一个结点、只有两个结点、有若干结点、链表长为奇数或偶数、链表
2020-08-06 22:01:54 116
原创 判断链表是否有环
判断链表是否有环/* 141 * 题目描述:判断链表中是否有环 * 解题思路:慢指针一次走一步、快指针一次走两步 * 当快指针指向空时链表无环,当快指针指向慢指针时链表有环 * */public class LinkedListCycle { public static void main(String[] args) { ListNode head = new ListNode(1); ListNode node1 = new ListNode(2); List
2020-08-06 21:59:45 121
原创 链表倒数第K个结点
链表倒数第K个结点/* 剑指offer22;链表中第倒数第k个结点 * 题目描述:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数, * 即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始, * 它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。 * 解题思路:1.倒数第k个结点的正序为:leng-k+1,先遍历链表求链表长度,再遍历链表取第length-k+1个结点 * 2.维
2020-08-06 21:58:10 107
原创 合并有序链表
合并有序链表/* 剑指offer25:合并两个排序链表 * 题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 * 解题思路:设两链表分别为L1、L2,P1、P2分别指向L1的第一、第二个结点,q指向L2的第一个结点 * 若q小于p1将q的后继设为p1,p1指向q p2指向p1,q指向后继 * 若q大于等于p1且小于p2将q插入p1 p2中,q指向后继,p1不动、p2指向q * 若q大于p2,p1指向p2,p
2020-08-06 21:56:20 208
原创 链表的中间元素
链表的中间元素public class FindMiddleNode { /* 867 * 问题描述:找到链表的中间元素 * 解题思路: * 1.先求链表长度再遍历到第二分之length的结点 * 2.声明快指针p一次向后移动两步,慢指针q一次向后移动一步 * 当快指针到表尾时,慢指针到表的中间位置。 * 规定:只有一个或两个结点的情况下返回头结点 * */ public static void main(String[] a
2020-08-06 21:52:39 133
原创 反转链表
反转链表/* 剑指offer24 反转链表 * 题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 * 解题思路: * 1.遍历链表,逐个结点入栈,栈中结点出栈重新组装链表 * 2.声明两个指针,p指向null(头结点的前一个结点)q指向头结点 * 遍历链表同时移动pq指针,声明temp指向q的后继,q的后继指向p,p指向q * 3.创建伪头结点,遍历链表顺序将各结点插在头结点之后 * 测试用例:防空串、只有一个结点的串
2020-08-04 22:35:40 155
原创 2020-08-04
矩阵中的路径/* 剑指offer矩阵中的路径 * 题目描述:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。 * 路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。 * 如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。 * 解题思路: * 深度优先搜索(以一个元素为例) * dfs:若该点不合法(下标越界、字符与word对应位置不相等、已被访问)返回false *
2020-08-04 22:34:00 80
原创 二叉树的镜像
二叉树的镜像/* 剑指offer27 二叉树的镜像 * 题目描述:请完成一个函数,输入一个二叉树,该函数输出它的镜像。 * 解题思路:在遍历二叉树的同时,交换左右孩子 * */public clclass ErChaShuDeJingXiangSolution { public TreeNode mirrorTree(TreeNode root) { if(root==null) return null; //先根遍历,交换根节点左右孩子 TreeN
2020-08-04 22:32:26 65
原创 树的子结构
树的子结构/* 剑指offer26:树的子结构 * 题目描述:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) * 解题思路:遍历二叉树A如果A中某个结点R等于B的根节点,判断以R为根节点的子树是否等于B * 测试数据: * */public class ShuDeZiJieGou { public static void main(String[] args) { TreeNode rootA = new TreeNode(-2); rootA.l
2020-08-04 22:30:41 99
原创 从上到下打印二叉树II
从上到下打印二叉树II/* 剑指 Offer32 :从上到下打印二叉树 II * 题目描述:从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。 * 解题思路:相较于普通的层序遍历,本题加了每一层打印一行的限制 * 3 * 9 20 * 15 7 * 两个问题:1.如何确定树有多深 2.如何分层 * 返回值要求链表啊,不用事先确定有几层,每层有几个 * 这就比较简单了,根结点入队、根结点出
2020-08-04 22:28:10 117
原创 从上到下打印二叉树(层次遍历)
从上到下打印二叉树(层次遍历)/* 剑指offer32-1:从上到下打印二叉树 * 题目描述:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。(层序遍历) * 解题思路:借助栈来实现,将树的结点依次入栈,出栈时输出并将所有的孩子入栈。 * 测试:null; * */public class CongShangDaoXiaDaYinErChaShu { public static void main(String[] args) { TreeNode root
2020-08-04 22:26:29 165
原创 非递归实现二叉树中序遍历
非递归实现二叉树中序遍历class BinaryTreeInorderSolution2{ public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<Integer>(); Stack<TreeNode> stack = new Stack<TreeNode>(); TreeNode curr =
2020-08-04 22:24:38 197
原创 非递归实现二叉树后序遍历
非递归实现二叉树后序遍历/* 145. 二叉树的后序遍历 * 题目描述:非递归实现二叉树中序遍历 * 解题思路: * */public class BinaryTreePostorder { public static void main(String[] args) { TreeNode root = new TreeNode(1); root.left=new TreeNode(2); root.right=new TreeNode(3); BinaryTreePo
2020-08-04 22:22:57 187
原创 非递归实现二叉树的前序遍历
非递归实现二叉树的前序遍历/* 144.二叉树的前序遍历 * 题目描述:采用非递归的方式对二叉树完成前序遍历 * 解题思路: * 1 * 2 3 * 4 56 7 * 根节点入栈,弹出栈顶结点并访问,栈顶结点的右孩子左孩子入栈,重复该过程直到栈空 * 1入栈,1出栈输出32入栈,2出栈输出54入栈,4出栈输出,5出栈输出,3出栈输出76入栈。。 * */public class BinaryTreePreorder {}//
2020-08-04 22:20:38 310
原创 旋转数组最小数字
旋转数组最小数字/*旋转数组最小数字(剑指offer、二分查找) * 题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 * 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。 * 解题思路: * 题目要求找到最小元素,第一反应是排序,但数组基本有序直接排序浪费性能。 * 结合数据的特点前半部分递增,后半部分递减,从头开始遍历直到有元素小于前一个数. * 上面一种思路的目的是要找到递增部分和递减部分的临界点该点的特性为大于前一个和后
2020-08-04 22:17:56 109
原创 机器人运动的范围(BFS)
机器人运动的范围(BFS)/* 剑指Offer13 机器人的运动范围 * 题目描述:地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。 * 一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外), * 也不能进入行坐标和列坐标的数位之和大于k的格子。 * 解题思路: * 广度优先搜索,首先将00点入栈,然后将栈顶元素的可访问点入栈将栈顶元素出栈,直到栈空。 * * */public c
2020-08-03 17:44:58 162
原创 顺时针打印矩阵
顺时针打印矩阵/* 剑指offer29 顺时针打印矩阵 * 题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 * 解题思路:定义一种新的对二维数组的遍历方式,从00开始,遍历到的结点放入一维数组 * 任意结点先向右移动不能移动时向下 * 向下不能移动时向左 * 向左不能移动时向上 * 向上不能移动时向右 * 否则返回一位数组 * 不能移动的结点的定义:下标越界或者被访问过 * 特殊情况:空矩阵、只
2020-08-03 17:42:44 93
原创 LeetCode1343
LeetCode1343/*题目描述:给定一个数组Array、子数组长度k、子数组平均值阀值threshold * 求出 Array的长度小于k平均值大于等于threshold的子数组的数量。 *解题思路:维持指针tail指向子数组的尾部、指针head指向子数组头部,声明sum * 记录当前子数组的和,每次将head、tail后移一位,sum=sum-tail+newHead * 若sum/k大于等于threshold,result+1; * */
2020-08-03 17:41:22 277
原创 奇数置于数组前半部分偶数置于数组后半部分
奇数置于数组前半部分偶数置于数组后半部分/* 剑指offer21,输入一个整数数组,实现一个函数来调整该数组中数字的顺序, * 使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 * 解题思路: * 1.遍历数组当遇到偶数时,将该偶数后的所有数字前移一位,偶数放到数组的最后。 * 这种方法的时间复杂度为o(n**2) * 2.双指针法,头指针指向数组头、尾指针指向数组尾 * 移动头指针,如果头指针指向奇数头指针后移 * 如
2020-08-03 17:38:25 449
原创 幂函数
幂函数/* 实现函数double Power(double base, int exponent),求base的exponent次方。 * 不得使用库函数,同时不需要考虑大数问题。 * 解题思路: * 考虑输入的取值,base可取负数、零、整数,exponent可取负数、正数、零 * base取零时无论exponent取值为何均返回0 * base取正或取负,计算方法相同都连乘exponent次 * exponent取正计算节果直接返回,exponent取负返回1/计算节果
2020-08-03 17:34:07 234
原创 数组中重复的数字
数组中重复的数字/* 剑指offer3 数组中重复的数字 * 题目描述:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的, * 但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 * 解题思路:1.将数组排序然后遍历,空间复杂度o(1) 时间复杂度o(n+nlogn) * 2.遍历数组,依次将元素映射到哈希表上,hash(array[i])非空则有重复元素,时间复杂度o(n) 空间复杂度
2020-08-03 17:30:20 97
原创 逆置链表
逆置链表public class InterViewQuestion_ReverseLinkList { public static int[] reversePrint(ListNode head) { /*题目描述:将链表逆置以数组的形似返回 *解题思路: * 创建栈(以ArrayList的形式) * 遍历链表,取值入栈 * 栈中元素逐个出栈放入结果集 *时间复杂度:2n *空间复杂度:2n * */ //创建栈 ArrayList<I
2020-08-03 17:28:35 115
原创 用两个栈实现队列
用两个栈实现队列public class InterView09_ImplementsQueueByStacks { /*题目描述:用两个栈实现队列,完成出队入队功能,若队列空则返回-1 * 解体思路: * 声明创建两个栈,stack1(负责入队)、stack2负责出队. * 元素入队时将其放入stack1中 * 元素出队时从stack2弹出元素,若stack2为空将stack1中的全部元素弹出放入stack2,若stack1也为空返回-1 * */ public static
2020-08-03 17:26:28 128
原创 返回斐波那契数列第n项
返回斐波那契数列第n项题目描述:返回斐波那契数列第n项解体思路:斐波那契数列:形如 0、1、1、2、3、5、8、13的数列(第1项为0,第二项为1之后第n项为前两项的和)解法1:使用递归求解解法2:使用递归求解但开辟额外的空间用来存储已经求得斐波那契数解法3:动态规划class Solution { /*返回斐波那契数列第n项 * */ int[] fibonacciList = new int[100]; public Solution() { // TODO Auto-ge
2020-08-03 17:21:54 849
原创 打印从1到n位最大值
打印从1到n位最大值剑指offer17 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。解题思路:返回数组的长度为10的n次幂减1。n<0,返回null如果数组长度很大超出了Max_int或Max_Long怎么办?用字符串或数组模拟加减法。public class DaYinCong1DaoZuiDaDenWeiShu { public static void main(String[] args)
2020-08-03 17:17:04 134
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人