剑指offer
boboluotou
前端小白的进阶之路。
展开
-
和为S的连续正数序列 JZ41
目录1 题目描述2 题解2.1 暴力枚举2.2 前缀和2.3 滑动窗口1 题目描述2 题解题目抽象:给定一个1~sum的序列,求和为sum的连续子序列。2.1 暴力枚举算法步骤:用指针 i 枚举目标序列左边界用指针 j 枚举目标序列右边界用指针 k 枚举区间[ i , j ],来计算区间和,看是否等于目标sum。代码如下:class Solution {public: vector<vector<int> > FindContinuousSequen原创 2020-12-14 10:55:13 · 186 阅读 · 0 评论 -
链表中环的入口节点 JZ55
目录1 题目描述2 题解2.1 哈希法2.2 双指针3 判断链表有无环(相似题)1 题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。2 题解2.1 哈希法创建一个set容器,遍历链表查看set内是否存在该结点,不存在则存入set,存在说明链表有环返回结点,遍历结束则返回null,链表无环。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) :原创 2020-12-08 17:22:18 · 151 阅读 · 0 评论 -
二进制中1的个数 JZ11
目录1 题目描述2 题解2.1 暴力法2.2 技巧法1 题目描述 输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。2 题解原码、补码、反码 知识详解2.1 暴力法 当然这种方法,对于大部分数据是对的,但是对于-2147483648,二进制为1000…000,一共有31个0.因为计算机使用补码存储二进制数据的。对于这个数据,我们的方***输出0,实际上为1.所以这种方法不对。2.2 技巧法别人写的解析。 解析:如果一个整数不为0,那么这个整数至少有一位是1。如果我原创 2020-12-04 17:13:54 · 141 阅读 · 0 评论 -
数组只出现一次的数字 JZ40
目录1 题目描述2 题解2.1 哈希map2.2 位运算1 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。2 题解2.1 哈希map 遍历一遍数组,用map记录出现的次数,然后再遍历一遍数组,找出出现1次的数字。class Solution {public: void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { map<in原创 2020-12-02 18:36:53 · 178 阅读 · 0 评论 -
和为S的两个数字 JZ42
这里写目录标题1 题目描述2 题解1 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。2 题解两数间隔越远乘积越小证明如下://输出两个数的乘积最小的。这句话的理解?假设:若b>a,且存在,a + b = s;(a - m ) + (b + m) = s则:(a - m )(b + m)=ab - (b-a)m - m*m < ab;说明外层的乘积更小也就是说依然是左右夹逼法!!!原创 2020-12-01 16:34:49 · 138 阅读 · 0 评论 -
约瑟夫环问题
目录1 题目描述1.1 例题2 题解2.1 链表法2.2 推理法2.2.1 递归法2.2.2 循环迭代法1 题目描述先来看这个类型的某个题目描述:约瑟夫生者死者游戏约瑟夫游戏的大意:30个游客同乘一条船,因为严重超载, 加上风浪大作,危险万分。因此船长告诉乘客,只有将全船 一半的旅客投入海中,其余人才能幸免于难。无奈,大家只 得同意这种办法,并议定30 个人围成一圈,由第一个人数起,依次报数,数到第9人,便把他投入大海中,然后再从 他的下一个人数起,数到第9人,再将他投入大海中,如此 循环地进行,直原创 2020-11-30 22:08:20 · 138 阅读 · 0 评论 -
统计一个数字在升序数组中出现的次数。
目录1 题目2 题解2.1 暴力2.2 二分法1 题目题目描述统计一个数字在升序数组中出现的次数。2 题解2.1 暴力2.2 二分法暴力法没有把数组有序的条件利用上,因为数组是升序的,目标值如果有多个就是连在一起的,因此我们可以查找目标值的范围即:上界和下界。下界:如果存在目标值,则指向第一个目标值,否则,如果不存在,则指向大于目标值的第一个值。上界:不管目标值存在与否,都指向大于目标值的第一个值。即使用两次二分法分别找下界和上界。上界:当目标值大于中间值时,l=mid+1;若数组原创 2020-11-27 21:15:10 · 259 阅读 · 0 评论 -
构建乘积数组
目录1 题目描述2 题解1 题目描述 给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];) 对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。2 题解根据题目要求不能使用乘法根据图片可将B[i]按对角线分原创 2020-11-25 17:17:11 · 49 阅读 · 0 评论 -
数值的整数次方
目录1 题目描述2 解题思路2.1 暴力解题2.2 递归法(快速幂)2.3 非递归的快速幂1 题目描述题目链接 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 保证base和exponent不同时为0 示例12 解题思路预处理:求 pow(b , n), 如果n为负数怎么解决?例如求 x−2x^{-2}x−2 是不是可以转换成 (1x)2(\frac 1x)^2(x1)2于是,预处理代码如下:double Power原创 2020-11-25 16:49:07 · 66 阅读 · 0 评论 -
数字 1 的个数
目录1 题目描述2 题解2.1 案例分析2.2 核心代码1 题目描述题目链接2 题解解题思路: 将1~n 的个位、十位、百位、…的1出现次数相加,即为1出现的总次数。设数字n是个x位数,记n的第i位为nin_ini,则可将n写为nxnx−1...n2n1n_xn_{x-1}...n_2n_1nxnx−1...n2n1:称"nin_ini"为当前位,记为cur将"ni−1ni−1...n2n1n_{i-1}n_{i-1}...n_2n_1ni−1ni−1...n2n1"称原创 2020-11-20 18:43:51 · 139 阅读 · 0 评论 -
二叉树的深度
目录1 题目描述2 题解2.1 递归法2.2 层次遍历1 题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。2 题解 题目抽象:给出一颗二叉树,求树的最大深度,也就是从根节点到所有叶子节点中的最大值。2.1 递归法分别计算左右子树的深度,选择最大的一个+1/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;原创 2020-11-25 16:48:11 · 536 阅读 · 0 评论 -
不用加减乘除做加法
目录1 题目描述1.1 位运算1.1.1 一位加法1.1.2 二位加法1.1.3 更高位的加法1.1.4 代码1 题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号1.1 位运算 使用位运算实现加法1.1.1 一位加法普通加法异或1 + 1 = 01^1 = 0 (错误)1 + 0 = 11^0 = 1 (正确)0 + 1 = 10^1 = 1 (正确)0 + 0= 00^0 = 0 (正确)问题:没有采取进位原创 2020-11-25 16:47:51 · 56 阅读 · 0 评论