
剑指offer
算法真不会
这个作者很懒,什么都没留下…
展开
-
剑指offer——从上到下打印二叉树(Ⅰ,Ⅱ,Ⅲ)
从上到下打印二叉树从上到下打印二叉树 Ⅰ从上到下打印二叉树 Ⅱ从上到下打印二叉树Ⅲ 从上到下打印二叉树 Ⅰ 从上到下打印二叉树 Ⅱ 从上到下打印二叉树Ⅲ原创 2021-03-18 09:29:17 · 340 阅读 · 2 评论 -
剑指offer——顺时针打印矩阵
题解:顺时针打印矩阵题目描述思路分析代码实现 题目描述 题目链接: https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/ 思路分析 题意大概就是这样的要求 需要开辟O(mn)的空间,时间复杂度O(mn),我们顺时针定义四个方向,上,右,下,左,从左上角开始遍历,先往右走,走到不能走为止,然后再换下一个方向,直到遍历完所有格子为止, 关于如下代码为什么这么写可以参考蛇形矩阵这篇博客中的思路,在这里就不做解释了原创 2021-03-17 17:23:31 · 224 阅读 · 0 评论 -
剑指offer——0到n-1中缺失的数字(二分思维)
0到n-1中缺失的数字题目描述思路分析代码实现 题目描述 题目链接: https://www.acwing.com/problem/content/64/ 思路分析 所以我们只需要更新边界即可,当nums[mid]!=mid,就更新到左边界[l,mid],反之更新到右边界[mid+1,r] 代码实现 class Solution { public: int getMissingNumber(vector<int>& nums) { if(nu原创 2021-03-06 23:45:23 · 154 阅读 · 0 评论 -
剑指offer——数值的整数次方(超详解)
题解:数值的整数次方题目描述思路分析代码实现 题目描述 题目链接: https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/ 思路分析 刚开始看完题,自以为这个题目不是很难,那么就直接掉到题的坑里了 但是上面这种写法对于数据考虑的并不全面,如果指数是0或者负数怎么办呢?上面的代码只考虑了指数大于0的情况 指数为负数是,我们可以取个绝对值,然后返回倒数,那 0 怎么办呢?对 0 取倒数是没有意义的,且底数为 0,但指原创 2021-02-07 13:42:41 · 348 阅读 · 4 评论 -
剑指offer——剪绳子
题解:剪绳子题目描述思路分析代码实现 题目描述 题目链接: https://www.acwing.com/problem/content/24/ 思路分析 做这个题之前大家先了解个数学知识,这里我贴上y总的证明过程,大家就对这个题会有一个清晰的认知 时间复杂度分析:当 n 比较大时,n 会被拆分成 [n/3] 个数,我们需要计算这么多次减法和乘法,所以时间复杂度是 O(n) 代码实现 class Solution { public: int maxProductAfterCutting原创 2021-02-06 21:10:15 · 200 阅读 · 0 评论 -
剑指offer——机器人运动的范围
题解:机器人运动的范围题目描述思路分析代码实现 题目描述 题目链接: https://www.acwing.com/problem/content/22/ 思路分析 这道题是非常经典的BFS问题 我们首先从(0,0)位置开始搜索,每次朝着上下左右四个方向开始搜索,扩展新的节点 扩展新的节点需要满足以下的条件: 之前没有遍历过的点用bool数组来判断 不能走出边界 横纵坐标之和小于给定值 k 答案就是遍历过的合法的节点 四个方向的数组 int dx[4] = {-1, 0, 1, 0}, dy[4]原创 2021-02-06 20:15:29 · 235 阅读 · 1 评论 -
剑指offer——旋转数组的最小数字
题解:旋转数组的最小数字题目描述思路分析代码实现 题目描述 思路分析 这题可用二分的思想,我们先将数组中的值画到一个二维坐标系中 横坐标表示数组下标的值,纵坐标表示数值,水平的线段表示相等的数值 我们发现除了最后水平的一段(黑色水平那段)之外,其余部分满足二分性质:竖直虚线左边的数满足 nums[i]≥nums[0];而竖直虚线右边的数不满足这个条件 分界点就是整个数组的最小值 代码实现 class Solution { public: int findMin(vector&原创 2021-01-30 17:09:48 · 193 阅读 · 2 评论 -
剑指offer——二叉树的下一个节点
题解:二叉树的下一个节点题目描述思路分析代码实现 题目描述 思路分析 求二叉树中给定节点的后继 如果当前节点有右儿子,则右子树中最左侧的节点就是当前节点的后继。比如F的后继是H 如果当前节点没有右儿子,则沿着father域一直向上找,找到第一个是father左儿子的节点,那么该节点的father就是当前节点的后继 举个例子:当前节点为D,D没有右儿子,向上找,找到第一个father左儿子节点C,C的父亲是F,所以F就是D节点的后继 代码实现 时间复杂度O(h) h为树的高度 /**原创 2021-01-30 15:48:34 · 188 阅读 · 0 评论 -
剑指offer——重建二叉树
题解:重建二叉树题目描述思路分析代码实现 题目描述 思路分析 先说下基本思路,首先通过前序遍历找到root并创建根结点 在中序遍历中找到root的位置标记为k,那么k的左边就是左子树的中序遍历,k的右边就是右子树的中序遍历 假设左子树中序遍历长度为l,那么前序遍历中,根节点后面的l长度就是左子树的前序遍历,剩下的就是右子树前序遍历 知道了左右子树的前序遍历和中序遍历,递归创建左右子树,再创建根结点 用哈希表记录每个值在中序遍历中的位置 代码实现 class Solution {原创 2021-01-30 15:18:14 · 176 阅读 · 0 评论 -
剑指offer——二维数组中的查找
题解:二维数组中的查找题目描述思路分析代码实现 题目描述 思路分析 我们可以从右上角的元素x开始枚举 如果x等于target,则返回true 如果x大于target,因为x以下的数都大于target,就可以排除一列的数(纵坐标-1) 如果x小于target,因为x左边的数都小于target,就可以排除一行的数(横坐标+1) 当走完整个矩阵时,还没有匹配target,就返回false 代码实现 class Solution { public: int duplicateInArray(vec原创 2021-01-30 14:35:41 · 116 阅读 · 0 评论 -
剑指offer——不修改数组找出重复的数字
题解:不修改数组找出重复的数字题目描述思路分析代码实现 题目描述 这个题就是在这道题->找出重复的数字基础上加了一个不移动原数组条件 思路分析 一共有n+1个数,每个数的取值范围是1到n,所以至少会有一个数出现两次 然后我们采用分治的思想,将每个数的取值的区间[1, n]划分成 [1, n/2]和[n/2+1, n]两个子区间,然后分别统计两个区间中数的个数 划分之后,左右两个区间里一定至少存在一个区间,区间中数的个数大于区间长度 因此我们可以把问题划归到左右两个子区间中的一个,而且由于区间中数的原创 2021-01-30 14:36:52 · 164 阅读 · 0 评论 -
剑指offer——找出数组中重复的数字
题解:找出数组中重复的数字题目描述思路分析代码实现 题目描述 思路分析 代码实现 class Solution { public: int duplicateInArray(vector<int>& nums) { int n = nums.size(); for (auto x : nums) if (x < 0 || x >= n) return -1;原创 2021-01-30 14:38:02 · 137 阅读 · 0 评论