![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
八吨车
这个作者很懒,什么都没留下…
展开
-
剑指offer—不用加减乘除做加法
剑指offer—不用加减乘除做加法题目描述写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。示例:输入: a = 1, b = 1输出: 2 提示:a, b 均可能是负数或 0结果不会溢出 32 位整数思路题目要求不能用+,-,*,/,那么只能考虑位于运算:&,^,|,~,<<,>>首先我们知道 a ^ b(a 异或 b)是不进位的加法,而 (a & b) << 1 是进位那么原创 2020-06-21 23:13:44 · 109 阅读 · 0 评论 -
剑指offer—扑克牌中的顺子
剑指offer—扑克牌中的顺子题目描述从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。示例 1:输入: [1,2,3,4,5]输出: True 示例 2:输入: [0,0,1,2,5]输出: True限制:数组长度为 5数组的数取值为 [0, 13]思路1:先把数组进行排序(小到大)2:遍历数组· 若 nums[i] == 0,zer原创 2020-06-21 20:48:56 · 124 阅读 · 0 评论 -
LeetCode—将有序数组转换为二叉搜索树
LeetCode—将有序数组转换为二叉搜索树题目描述将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5思路1:有序数组中间的数就是其二叉搜索树的根节原创 2020-06-20 16:59:51 · 121 阅读 · 0 评论 -
剑指offer—翻转单词顺序
剑指offer—翻转单词顺序题目描述输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例 1:输入: "the sky is blue"输出: "blue is sky the"示例 2:输入: " hello world! "输出: "world! hello"解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能原创 2020-06-20 16:22:16 · 183 阅读 · 2 评论 -
剑指offer—和为s的两个数字,和为s的连续正数序列
剑指offer—和为s的两个数字题目描述输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例 1:输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]示例 2:输入:nums = [10,26,30,31,47,60], target = 40输出:[10,30] 或者 [30,10]思路这道题可以利用双指针来解决,一个指针 iii 指向 0,一个指针 jj原创 2020-06-20 15:55:16 · 98 阅读 · 0 评论 -
剑指offer—平衡二叉树
剑指offer—平衡二叉树题目描述输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3原创 2020-06-20 15:14:07 · 96 阅读 · 0 评论 -
剑指offer—数组中数字出现的次数
剑指offer—数组中数字出现的次数题目描述一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]示例 2:输入:nums = [1,2,10,4,1,4,3,3]输出:[2,10] 或 [10,2]思路假如题目要求是找出一个只出现一次的数,而其他都出现两次,那么直接遍历数组进行互相异或\color{red}原创 2020-06-19 23:46:10 · 115 阅读 · 0 评论 -
剑指offer—数组中的逆序对
剑指offer—数组中的逆序对题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5思路取第一个数和它后面的数进行比较,若比后面的数大,则 count++,依次取第二个数…但是这样时间复杂度就是O(N2)O(N^2)O(N2)((n−1)+(n−2)+...+1=n(n−1)/2=O(N2)(n-1) + (n-2) + ... + 1=n(n-1)/2=O(N^2)原创 2020-06-19 23:17:40 · 126 阅读 · 0 评论 -
剑指offer—丑数
剑指offer—丑数题目描述我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。说明: 1 是丑数。n 不超过1690。思路我们可以看出来每次都是前面某个数字乘以 2 或者 3 或者 5,取其中的最小者。我们定义三个指针 p2、p3、p5 分别指向要乘以 2、3、5 的数字。dp[i] 表示原创 2020-06-18 22:43:53 · 104 阅读 · 0 评论 -
排序算法之快速排序、归并排序,堆排序
快速排序一趟排序:取区间内第一个元素作为基准,将该元素放在适当的位置,此时基准数左边的数都比它小,基准数右边的数都比大。接下来便用同样的方法分别对左右两边的数据进行排序,直到序列中没有元素或只有一个元素。int partition(int a[], int low, int high){ int temp = a[low]; while(low < high) { while...原创 2020-02-05 22:08:50 · 148 阅读 · 0 评论 -
剑指offer—数组中出现次数超过一半的数字
剑指offer—数组中出现次数超过一半的数字题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2思路这里不考虑排序后直接返回下标为size/2的数(时间复杂度logNlogNlogN)题目里说次数超过一半,也就是说剩下的数全部加起来的次数都有要找的数出现的次数多\color{#FF3030}{剩下的数全部加起来的次数都有要找的数出现原创 2020-06-18 21:29:02 · 88 阅读 · 0 评论 -
剑指offer—字符串的排列
剑指offer—字符串的排列题目详情输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = "abc"输出:["abc","acb","bac","bca","cab","cba"]思路当没有重复字符时,可以遍历每一个字符,并且和当前字符往后的字符两两交换并递归,递归结束时再交换回来但因为题目要求是里面不能有重复数组,玩意字符串是aabc,那么就会出现重复的数,于是用集合来存储值,最后再将set转化为vector原创 2020-06-18 21:12:15 · 111 阅读 · 0 评论 -
剑指offer—二叉搜索树与双向链表
剑指offer—二叉搜索树与双向链表题目详情输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。为了让您更好地理解问题,以下面的二叉搜索树为例:我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。特别地,我们希望可以就地完成转换操原创 2020-06-18 01:30:18 · 114 阅读 · 0 评论 -
剑指offer—复制带随机指针的链表
剑指offer—复制带随机指针的链表题目描述给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的 深拷贝。我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:val:一个表示 Node.val 的整数。random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。思路假如没有随机指针,那么我们直接一边遍历链表一边复原创 2020-06-18 00:42:45 · 116 阅读 · 0 评论 -
剑指offer— 二叉树中和为某一值的路径
剑指offer— 二叉树中和为某一值的路径题目描述输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返原创 2020-06-17 22:29:42 · 87 阅读 · 0 评论 -
剑指offer—二叉搜索树的后序遍历序列
剑指offer—二叉搜索树的后序遍历序列题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树: 5 / \ 2 6 / \ 1 3示例 1:输入: [1,6,3,2,5]输出: false示例 2:输入: [1,3,2,6,5]输出: true思路二叉搜索树特点:左子树比当前值小,右子树比当前值大;即左子树的全部结原创 2020-06-17 22:01:26 · 89 阅读 · 0 评论 -
剑指offer—栈的压入、弹出序列
剑指offer—栈的压入、弹出序列题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), p原创 2020-06-17 21:18:09 · 88 阅读 · 0 评论 -
剑指offer—包含min函数的栈(一个栈实现,两个栈实现)
剑指offer—包含min函数的栈题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。思路1:两个栈,一个存储值,一个存储当前栈的最小值副栈s2一直保持着主栈s1中最小的值,当push操作时,先判断入栈的x是否比s2.top()要大,如果要大的话,那么说明栈里面已经有更小的值,再继续添加一个s2.top()到副栈s2,最后把x入s1min操作时,直接返回s2.top()即可,因为副栈的顶部永远原创 2020-06-16 22:47:48 · 373 阅读 · 0 评论 -
剑指offer—二叉树的镜像,对称的二叉树
剑指offer—二叉树的镜像题目描述请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入: 4 / \ 2 7 / \ / \1 3 6 9镜像输出: 4 / \ 7 2 / \ / \9 6 3 1 示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]思路第一应该就能想到递归,递归是有终止条件的,那么此题意下终止条件为:若roo原创 2020-06-16 21:01:24 · 176 阅读 · 0 评论 -
剑指offer—树的子结构
剑指offer—树的子结构题目描述输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A: 3 / \ 4 5 / \ 1 2给定的树 B: 4 / 1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。示例 1:输入:A = [1,2,3], B = [3,1]输出:false示例 2:输入:A = [3,原创 2020-06-16 20:29:39 · 84 阅读 · 0 评论 -
剑指offer— 合并两个排序的链表,合并K个排序链表的三种思路及复杂度的分析
剑指offer— 合并两个排序的链表题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路新建一个头结点,然后再创建一个遍历的指针p,同时将比较pHead1和pHead2当前值的大小,p指向较小的结点,更新p的值(p = p->next),同时更新较小结点的指针使其指向下一个结点![在这里插入图片描述](htt原创 2020-06-11 00:34:28 · 619 阅读 · 1 评论 -
剑指offer—链表中倒数第k个结点
剑指offer—链表中倒数第k个结点题目描述输入一个链表,输出该链表中倒数第k个结点。思路定义两个指针p2指针移动一格,k减1,直到 k == 0情况1p2没移动到最后一个元素,令 p2 = p2->next,此时再把p2和p1一起移动,直到 p2== NULL倒数第k个元素为:p1 -> next,返回即可情况2此时 k == 链表的长度,当 k = 0 时,p2移动到最后一个元素,此时倒数第 k 个元素就是第一个元素,返回 p1 即可代码 ListNod原创 2020-06-08 01:28:06 · 85 阅读 · 0 评论 -
剑指offer—调整数组顺序使奇数位于偶数前面
剑指offer—调整数组顺序使奇数位于偶数前面题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路有些小伙伴可能会觉得这题很简单,双指针,一个指向头部,一个指向尾部,左指针定位到偶数,右指针定位到奇数,然后交换两个数,再向中间移动,想法顾然美好,但是别忘了题目要求保证奇数和奇数,偶数和偶数之间的相对位置不变。这就行不通了正确的思路应该是:创建一个临时数组,顺序遍历数组,将原创 2020-06-07 23:54:24 · 90 阅读 · 0 评论 -
剑指offer—二进制中1的个数
剑指offer—二进制中1的个数题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路题目要求从二进制中求出“1”的个数,首先这里要知道位移操作,当一个数向左移动 nnn 位时,相当于乘上 2n2^n2n,为什么呢?任何数字在计算机中都是二进制,比如 333, 二进制表示 111111,指数表示 21+202^1 + 2^021+20假如现在 333 向左移动一位,那么相当于给每一个有效位增加1的权重:21+1+20+12^ {1+1}+ 2^{0+1}21+1+20+1原创 2020-06-05 23:23:56 · 100 阅读 · 0 评论 -
剑指offer—跳台阶,变态跳台阶
剑指offer—跳台阶题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路当青蛙跳到第n级台阶时,可以从 n-1 级台阶跳1级跳上来,也可以从 n-2 级台阶跳2级跳上来,所以 n = (n - 1)+(n - 2)以此类推,n-1 = (n - 2)+(n - 3), n - 2 = (n - 3)+(n - 4)…,3 = 2 + 1,当位于第二级台阶时,有两种跳法(一种直接跳两步;一种一次跳一步,跳两次),一级台阶原创 2020-06-05 22:37:17 · 77 阅读 · 0 评论 -
剑指offer—旋转数组的最小数字
剑指offer—旋转数组的最小数字题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0思路将要查找数组的范围定义为 [left, right],取中值 mid = (left + right) / 2当 numbe原创 2020-06-05 00:28:16 · 76 阅读 · 0 评论 -
剑指offer—用两个栈实现队列,基础方法及优化方法
剑指offer—用两个栈实现队列题目描述用两个栈来实现一个队列,完成队列的push和pop操作。 队列中的元素为int类型。思路1一个栈为主栈,弹出顺序就是进队的顺序;一个栈为副栈,在push操作时候做辅助作用push操作:先将主栈里的数一个一个拿出来放入副栈里面,再将要插入的值push进副栈,这时候副栈从栈底往上的顺序就是入队顺序,最后只需要把副栈的数再移到主栈就可以了。pop操作:若主栈有值则弹出代码实现public: void push(int node) {原创 2020-06-04 23:53:24 · 341 阅读 · 0 评论 -
剑指offer—从前序与中序遍历序列构造二叉树
剑指offer—从前序与中序遍历序列构造二叉树题目描述根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7思路前序遍历(DLR),中序遍历为(LDR)前序遍历数组的第一个数字,就将中序遍历数组一分为二(因为无重复元素)记preor原创 2020-06-04 00:34:47 · 338 阅读 · 0 评论 -
剑指offer—替换空格
剑指offer—替换空格题目描述请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = "We are happy."输出:"We%20are%20happy."思路n先从左向右遍历,统计空格的个数为sum,将数组的长度扩大到length+2*sum,并用双指针完成空格的替换,具体操作如下:指针①定位到原数组的最后一个位置,指针②定位到扩容后数组的最后一个位置:1:若指针①的前字符为非空格,指针②位置填充指针①定位到的当前字符,指针①和指针②分别向左移动一位原创 2020-06-03 23:51:04 · 84 阅读 · 0 评论 -
剑指offer—二维数组中的查找
剑指offer—二维数组中的查找题目描述在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]原创 2020-06-03 22:44:25 · 87 阅读 · 0 评论 -
剑指offer—顺时针打印矩阵
剑指offer—顺时针打印矩阵题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:[ [1,2,3], [4,5,6], [7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:[ [1,2,3,4], [5,6,7,8], [9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]思路定义上,下,左,右四个变量来记录四个边界值,通过边界值的不断缩小来达到顺时针遍历的目的。.原创 2020-06-01 00:08:37 · 108 阅读 · 0 评论 -
剑指offer—topK问题,最小的k个数——手写大根堆(堆排变形),快排变形Partition
题意:输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。类似这种topK问题,都可以用堆排序的变形来解决堆排序代码:#include<iostream>#include<vector>using namespace std;// 递归方式构建大根堆(len是arr的长度,in...原创 2020-05-06 10:12:29 · 300 阅读 · 0 评论 -
剑指offer—数值的整数次方,LeetCode-50. Pow(x, n)具体分析
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。xn=x2k1+2k2+...2ki x^{n}=x^{2^{k_1}+2^{k_2}+...2^{k_i}} xn=x2k1+2k2+...2ki =x2k1∗x2k2∗...∗x2ki\qquad\qquad\qu...原创 2020-02-22 21:36:02 · 124 阅读 · 0 评论