剑指Offer day1
3、数组中重复的数字 https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/
找出数组中重复的数字,题目中给定了一个长度为n的数组,并且所有数字都在0-n-1的范围内。
如果我们利用一个数组或者集合去记录每个数出现的频次,这样的空间复杂度是O(n)的,我们可以选择空间复杂度为O(1)的原地解法。
我们是一组刚好没有重复的数字,0~n-1,那么每个数都应该放在自己对应的位置上,比如0应该放在第一个位置,1应该放在第1个位置…..
1 | class Solution { |
4、二维数组中的查找 https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/
题目的意思很简单,意思我们从一个n*m的二维数组中,寻找一个整数。该题目的性质就是从左到右都是递增,并且从上到下也都是递增的。
1 | class Solution{ |
5、替换空格 https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/
直接利用语法
1 | class Solution{ |
6、从头到尾打印链表 https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/
实质上就是一个对于链表的遍历。我们可以采取对链表反转,然后直接遍历一遍得到结果的方式
1 | class Solution { |
同样的,一旦设计到反转,我们可以利用栈这个特殊的数据结构
1 | class Solution { |
7、重建二叉树
给定一个二叉树的前序遍历和中序遍历,让我们重建二叉树,这是一个经典的问题。
根据前序遍历的性质,前序遍历数组中第一个数即为根节点。 只要我们在中序遍历中找到这个数,那么就可以分为左右两部分,其中左边部分为该树对应的左子树,右边部分对应为该树的右子树。
1 | class Solution { |
9、用两个栈实现队列
本题考察了栈和队列之间的关系,栈是后进先出的数据结构,而队列是先进先出的数据结构。
1 | class CQueue { |
10-1、 斐波那契数列 https://leetcode-cn.com/problems/fei-bo-na-qi-shu-lie-lcof/
f(n)=f(n-1)+f(n-2) 如果我们采用自顶向下的递归方法。会出现很多重复的计算,即使我们利用一个哈希表存储结果,其时间复杂度也是不乐观的。此时我们采用自底向上的方法去实现。也即f(3)=f(1)+f(2),依次往后递推。
1 | class Solution{ |
10-2、 青蛙跳台阶 https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/
与上一题斐波那契基本上一样
1 | class Solution { |
11、旋转数组的最小数字 https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/
由于数组是两段有序的,我们可以直接利用二分法进行查找
1 | class Solution { |
12、矩阵中的路径 https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof/
标准的dfs+回溯模版
1 | class Solution { |