
算法
文章平均质量分 65
欲与太阳肩并肩
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 43. 1~n 整数中 1 出现的次数
剑指 Offer 43. 1~n 整数中 1 出现的次数题目描述:输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。示例:Input: n = 12Output: 5解题思路:跟密码锁类似,我们每次只固定其中一位,其它位随意转动,然后看该位上出现1的可能是多少。我们把当前的固定位称为cur,在他左边的称为高位high,在右边的为低位low。假如我们的数字为3902,然后我们只看十位,也原创 2022-03-08 14:31:56 · 170 阅读 · 1 评论 -
背包九讲小结与 leetcode相关例题
引言最近在做leetcode的动态规划相关题目时,遇到了背包DP的相关问题,由于之前没有接触过,于是去阅读了背包九讲并结合leetcode上的题目进行加深印象,在做的过程中,也遇到了一些问题,借此记录并总结~问题描述:基本背包问题:基本背包问题分为0-1背包和完全背包,他们的区别在于每个物品只能拿一次或是无限次。首先我们使用以下的符号来表示各个变量cic_ici: 物品iii 所占用空间的大小wiw_iwi:物品 iii 的价值VVV: 背包总容量因此背包问题(Knapsack P原创 2022-02-24 11:44:21 · 293 阅读 · 0 评论 -
栈、队列与堆相关小结(剑指Offer相关题集合)
栈、队列与堆相关小结(剑指Offer相关题集合)引言最近在练习算法题时,发现有许多题都巧妙地运用了一些数据结构的特性,然后可以快速的求解问题,借此来做个小结。首先在具体到每道题时,先介绍以下相关的结构:栈: 栈具有先进后出的特点,它如同一个杯子,底部是封闭的,因此当一个数据先被压进栈,它会在栈底,而最后进栈的则会在栈顶,所以出栈的顺序则是最靠近栈顶的先出。LinkedList<Integer> stack = new LinkedList<Integer>();队列:原创 2022-01-02 19:33:34 · 430 阅读 · 0 评论 -
递归法与迭代法实现树的遍历
递归法与迭代法实现树的遍历递归法首先树的遍历分为,前序遍历,中序遍历,后序遍历。前序遍历: 对于当前结点,先对该结点进行操作,然后对他的左孩子进行操作,最后对他的右孩子进行操作。中序遍历: 对于当前结点,先对该结点的左孩子进行操作,然后对该结点进行操作,最后对他的右孩子进行操作。后序遍历: 对于当前结点,先对该结点的左结点进行操作,然后对右孩子进行操作,最后多该结点进行操作。递归序:其实对于树的遍历,递归法实现是比较简单的,只需要调整递归函数调用的位置即可,可是为什么递归能实现前序遍历,中序遍原创 2021-11-06 16:35:43 · 448 阅读 · 0 评论 -
剑指 Offer 35. 复杂链表的复制
剑指 Offer 35. 复杂链表的复制题目描述:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个结点除了有一个 next 指针指向下一个结点,还有一个 random 指针指向链表中的任意结点或者 null。示例:Input: head = [[7,null],[13,0],[11,4],[10,2],[1,0]]Output: [[7,null],[13,0],[11,4],[10,2],[1,0]]解题思路:思路一: 使用hash Map 存储链表的结点,原创 2021-11-03 19:08:41 · 91 阅读 · 0 评论 -
环形链表的快慢指针相遇问题证明
环形链表的快慢指针相遇问题证明证明1:慢指针一定在环形链表一圈内遇上首先假设慢指针的每次只走1步,快指针每次走2步,当慢指针走了k次后,慢指针共走了k步,而快指针走了2k步。假如说,快指针和慢指针一定会相遇,那么一定是在环内,同时快指针已经走了n圈环。此时该问题也就可以转变为一下问题何时有解2k−k=nB→k=nB(n=1,2,...,N)2k - k = nB \rightarrow k = nB (n = 1,2,...,N)2k−k=nB→k=nB(n=1,2,...,N)当n=1时,此时有原创 2021-11-03 12:13:29 · 1066 阅读 · 0 评论 -
回溯算法小结(leetcode回溯题集合)
回溯算法小结回溯法定义回溯法:采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:找到一个可能存在的正确的答案;在尝试了所有可能的分步方法后宣告该问题没有答案。上面说到回溯法在试错的过程中,会取消上一步或者几步的操作,从而开始进行其它的尝试。这时候的这个过程,原创 2021-10-24 12:59:27 · 580 阅读 · 0 评论 -
剑指 Offer 63. 股票的最大利润
剑指 Offer 63. 股票的最大利润题目描述:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例:Input: [7,1,5,3,6,4]Output: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。Input: [7,6,4,3,1]Output: 0解释: 在这种情况下, 没有交易完成,原创 2021-10-08 12:12:46 · 80 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列
剑指 Offer 10- I. 斐波那契数列题目描述:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例:Input: n = 2原创 2021-10-08 12:12:11 · 64 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指 Offer 53 - I. 在排序数组中查找数字 I题目描述:统计一个数字在排序数组中出现的次数。示例:Input: nums = [5,7,7,8,8,10], target = 8Output: 2Input: nums = [5,7,7,8,8,10], target = 6Output: 0解题思路:本题主要是考察二分法的边界条件的确定问题。题目中隐藏的信息是该数组是已经排序好的,而从示例可以看到,是按升序排序的,因此如果一个数字在该数组中重复出现,那么必定是连续的。想统计数原创 2021-10-03 17:07:34 · 78 阅读 · 0 评论 -
剑指Offer 24.反转链表
剑指Offer 24.反转链表题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:Input: 1->2->3->4->5->NULLOutput: 5->4->3->2->1->NULL对于链表与树的相关问题,主要方法是迭代遍历亦或者是递归的方法,这一题比较容易想到的是迭代法解题思路:1.迭代法首先从头开始,对于head以及head.next的元素,我们希望head与head.next的元素的原创 2021-09-24 14:43:07 · 73 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
剑指 Offer 06. 从尾到头打印链表题目描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例:Input: head = [1,3,2]Output: [2,3,1]解题思路:这道题比较简单,由于题目要求用数组返回,那么一般都可以想到创建一个链表长度一样大小的数组即可,链表长度则是通过遍历链表而获得。最后就通过倒着索引来给数组赋值即可。第二种方法通过看题解,发现可以通过栈来存储链表元素。题目要求从尾到头打印链表,也就是将链表反转。而栈有着先进后出的特点,因此原创 2021-09-24 14:40:17 · 72 阅读 · 0 评论 -
剑指Offer 30. 包含min函数的栈
剑指Offer 30. 包含min函数的栈题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.to原创 2021-09-23 16:28:09 · 98 阅读 · 0 评论 -
剑指Offer 09. 用两个栈实现队列
剑指Offer 09. 用两个栈实现队列题外话: 终于将论文初稿写完了,又可以愉快的自学了。接下来为期一个月的剑指Offer训练。题目描述:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例:Input: ["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[]原创 2021-09-23 16:25:13 · 76 阅读 · 0 评论 -
剑指Offer 14.剪绳子(循环求余法,快速幂求余)
剑指Offer 14.剪绳子题目描述:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m - 1] 。请问 k[0]*k[1]*…*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例:Input: 2Outp原创 2021-07-02 17:26:49 · 204 阅读 · 0 评论 -
树的知识点与算法题(持续更新......)
树的知识点与算法题首先定义一个二叉树#Definition for a binary tree node. public class TreeNode{ int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) {this.val = val} TreeNode(int val, TreeNode left, TreeNode right){ this原创 2021-06-29 21:42:40 · 192 阅读 · 0 评论