- 博客(20)
- 收藏
- 关注
原创 剑指 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 = 12 Output: 5 解题思路: 跟密码锁类似,我们每次只固定其中一位,其它位随意转动,然后看该位上出现1的可能是多少。我们把当前的固定位称为cur,在他左边的称为高位high,在右边的为低位low。 假如我们的数字为3902,然后我们只看十位,也
2022-03-08 14:31:56
220
原创 背包九讲小结与 leetcode相关例题
引言 最近在做leetcode的动态规划相关题目时,遇到了背包DP的相关问题,由于之前没有接触过,于是去阅读了背包九讲并结合leetcode上的题目进行加深印象,在做的过程中,也遇到了一些问题,借此记录并总结~ 问题描述: 基本背包问题: 基本背包问题分为0-1背包和完全背包,他们的区别在于每个物品只能拿一次或是无限次。 首先我们使用以下的符号来表示各个变量 cic_ici: 物品iii 所占用空间的大小 wiw_iwi:物品 iii 的价值 VVV: 背包总容量 因此背包问题(Knapsack P
2022-02-24 11:44:21
354
原创 栈、队列与堆相关小结(剑指Offer相关题集合)
栈、队列与堆相关小结(剑指Offer相关题集合) 引言 最近在练习算法题时,发现有许多题都巧妙地运用了一些数据结构的特性,然后可以快速的求解问题,借此来做个小结。 首先在具体到每道题时,先介绍以下相关的结构: 栈: 栈具有先进后出的特点,它如同一个杯子,底部是封闭的,因此当一个数据先被压进栈,它会在栈底,而最后进栈的则会在栈顶,所以出栈的顺序则是最靠近栈顶的先出。 LinkedList<Integer> stack = new LinkedList<Integer>(); 队列:
2022-01-02 19:33:34
492
原创 递归法与迭代法实现树的遍历
递归法与迭代法实现树的遍历 递归法 首先树的遍历分为,前序遍历,中序遍历,后序遍历。 前序遍历: 对于当前结点,先对该结点进行操作,然后对他的左孩子进行操作,最后对他的右孩子进行操作。 中序遍历: 对于当前结点,先对该结点的左孩子进行操作,然后对该结点进行操作,最后对他的右孩子进行操作。 后序遍历: 对于当前结点,先对该结点的左结点进行操作,然后对右孩子进行操作,最后多该结点进行操作。 递归序: 其实对于树的遍历,递归法实现是比较简单的,只需要调整递归函数调用的位置即可,可是为什么递归能实现前序遍历,中序遍
2021-11-06 16:35:43
529
原创 剑指 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
153
原创 环形链表的快慢指针相遇问题证明
环形链表的快慢指针相遇问题证明 证明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
1235
原创 回溯算法小结(leetcode回溯题集合)
回溯算法小结 回溯法定义 回溯法:采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况: 找到一个可能存在的正确的答案; 在尝试了所有可能的分步方法后宣告该问题没有答案。 上面说到回溯法在试错的过程中,会取消上一步或者几步的操作,从而开始进行其它的尝试。这时候的这个过程,
2021-10-24 12:59:27
703
原创 剑指 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
124
原创 剑指 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
99
原创 剑指 Offer 53 - I. 在排序数组中查找数字 I
剑指 Offer 53 - I. 在排序数组中查找数字 I 题目描述: 统计一个数字在排序数组中出现的次数。 示例: Input: nums = [5,7,7,8,8,10], target = 8 Output: 2 Input: nums = [5,7,7,8,8,10], target = 6 Output: 0 解题思路: 本题主要是考察二分法的边界条件的确定问题。题目中隐藏的信息是该数组是已经排序好的,而从示例可以看到,是按升序排序的,因此如果一个数字在该数组中重复出现,那么必定是连续的。想统计数
2021-10-03 17:07:34
119
原创 剑指Offer 24.反转链表
剑指Offer 24.反转链表 题目描述: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例: Input: 1->2->3->4->5->NULL Output: 5->4->3->2->1->NULL 对于链表与树的相关问题,主要方法是迭代遍历亦或者是递归的方法,这一题比较容易想到的是迭代法 解题思路: 1.迭代法 首先从头开始,对于head以及head.next的元素,我们希望head与head.next的元素的
2021-09-24 14:43:07
129
原创 剑指 Offer 06. 从尾到头打印链表
剑指 Offer 06. 从尾到头打印链表 题目描述: 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例: Input: head = [1,3,2] Output: [2,3,1] 解题思路: 这道题比较简单,由于题目要求用数组返回,那么一般都可以想到创建一个链表长度一样大小的数组即可,链表长度则是通过遍历链表而获得。最后就通过倒着索引来给数组赋值即可。 第二种方法通过看题解,发现可以通过栈来存储链表元素。题目要求从尾到头打印链表,也就是将链表反转。而栈有着先进后出的特点,因此
2021-09-24 14:40:17
126
原创 剑指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
158
原创 剑指Offer 09. 用两个栈实现队列
剑指Offer 09. 用两个栈实现队列 题外话: 终于将论文初稿写完了,又可以愉快的自学了。接下来为期一个月的剑指Offer训练。 题目描述: 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例: Input: ["CQueue","appendTail","deleteHead","deleteHead"] [[],[3],[]
2021-09-23 16:25:13
130
原创 剑指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: 2 Outp
2021-07-02 17:26:49
300
原创 包装类是什么(Integer和int的区别)
引言 今天在学习群里看到有人问了一个问题,发现涉及到基本数据类型与包装类等知识,发现自己掌握的并不好,查了下相关资料,借此记录下 public static void main(String[] args) { Integer i = 100; Integer i1 = 100; Integer j = 200; Integer j1 = 200; System.out.println(i==i1); //true System.out.println(j=
2021-07-01 19:40:09
740
原创 Java反射机制
反射 最近通过视频以及一些博客学习了Java反射机制,借此记录下 首先先谈到语言,语言可以分为两类,分别是动态语言和静态语言。 动态语言: 是一类在运行时可以改变其结构的语言,例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构 静态语言: 与动态语言相对,运行时不可变的语言就是静态语言。如Java、C、C++。 虽然Java不是动态语言,但是它具有一定的“准动态性”,可以利用反射机制、字节码操作获得类似动态语言的特性。 动态
2021-06-30 19:46:51
130
原创 树的知识点与算法题(持续更新......)
树的知识点与算法题 首先定义一个二叉树 #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
259
原创 冒泡排序及其优化
所谓冒泡排序法通过两个循环实现,通过相邻的两个元素的比较,并且把较大或较小的元素排在之后(本篇从小到大排序),以此来达到排序的效果 外循环控制待排序数组的边界,从第一个元素开始,到倒数第二个元素结束(因为倒数第二个元素才有下一个元素与其比较) 内循环控制相邻两个元素比较次数,比较相邻元素,并通过交换元素值的方式将最大值排在最后。(第一个与第二个比较,第二个与第三个比较.....
2017-05-12 11:12:17
267
原创 提高ListView的显示效率
我们一般使用getView()方法使ListView显示内容,这个方法在每个子项被滚动到屏幕内的时候会被调用。但是如果这个时候如果数据很多,ListView的运行效率是很低的,因为每次都要使用getView()的方法让布局重新加载了一遍,所以快速滚动时就会成为性能的瓶颈。 public View getView(int position, View convertView, ViewGroup p
2017-04-06 14:00:27
419
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅