滑动窗口的最大值
给定一个数组 nums
和滑动窗口的大小 k
,请找出所有滑动窗口里的最大值。
样例
1 | 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 |
思路
单调队列
存储下标
1 | class Solution { |
骰子的点数
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。
样例
1 | 输入: 2 |
思路
动态规划
使得$n-1$点数概率数组和$1$点数概率数组元素两两相乘,并将乘积结果加到$n$点数概率数组上。
代码
1 | class Solution { |
扑克牌的顺子
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
样例
1 | 输入: [1,2,3,4,5] |
思路
模拟
- 删除0
- 是否有重复
- 都不相同看最大和最小的差值是否在<=4
代码
1 | // 排序 |
圆圈中最后剩下的数字
0,1,,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
样例
1 | 输入: n = 5, m = 3 |
思路
约瑟夫环
暴力,略
递推:寻找相邻两个数的关系——$f(n,m) = (f(n-1,m)+m)\%n$,$f(1,m)=0$
删除第m个数的下标是m-1;对剩下的数重新编号;旧编号:m,m+1,m+2…;新编号:0,1,2…;有编号规则:(新 + m)% n
代码
1 | // 递归 |
股票的最大利润
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
样例
1 | 输入: [7,1,5,3,6,4] |
思路
枚举:枚举在哪一天卖,用minv
记录前 i
天的股票价格最小值(可降低时间复杂度)。
代码
1 | class Solution { |
求1+2+…+n
求 1+2+...+n
,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
思路
语法题
- 通向公式——不可以
- for(1~n)——不可以
- dfs(){if…}——不可以
if(A && B)
:只要A为false就不会再执行;if(A||B)
如果A为true,不管B直接执行;利用这个性质:
代码
1 | class Solution { |
不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
思路
位运算
计算机只有&
、|
、~
、^
(由前三种组合运算)。
多位数相加,一般串行,但是亦可以并行计算。A+B
可拆分为进位和+非进位和
两部分
代码
1 | class Solution { |
构建乘积矩阵
给定一个数组 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]
。不能使用除法。
样例
1 | 输入: [1,2,3,4,5] |
思路
$B_i=\frac{\sum^{n-1}_{i=0}A_i}{A_i}$,想一个循环顺序:先让$B_i$等于左边乘积,再让$B_i$等于右边乘积(倒着),再相乘。
代码
1 | class Solution { |
把字符串转换成整数
写一个函数StrToInt
,实现把字符串转换成整数这个功能。不能使用atoi
或者其他类似的库函数。
样例
1 | 输入: "42" |
思路
模拟
代码
1 | class Solution { |
二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
样例
1 | 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 |
思路
根据以上定义,若 rootroo**t 是 p, qp,q 的 最近公共祖先 ,则只可能为以下情况之一:
- $p$和$q$在$root$的子树中,且分列$root$的异侧(即分别在左、右子树中);
- $p = root$,且 $q$在$root$的左或右子树中;
- $q = root$,且 $p$在$root$的左或右子树中;
考虑通过递归对二叉树进行后序遍历,当遇到节点$p$或$q$时返回。从底至顶回溯,当节点$p$, $q$在节点$rootR$的异侧时,节点$root$即为最近公共祖先,则向上返回$root$。
递归解析:
终止条件:
- 当越过叶节点,则直接返回
null
; - 当
root
等于p
,q
,则直接返回root
;
- 当越过叶节点,则直接返回
递推工作:
- 开启递归左子节点,返回值记为
left
; - 开启递归右子节点,返回值记为
right
;
- 开启递归左子节点,返回值记为
返回值: 根据
left
和right
,可展开为四种情况;- 当
left
和right
同时为空 :说明root
的左 / 右子树中都不包含p
,q
,返回null
; - 当
left
和right
同时不为空 :说明p
,q
分列在root
的异侧(分别在 左 / 右子树),因此root
为最近公共祖先,返回root
; 当
left
为空 ,right
不为空 :p
,q
都不在root
的左子树中,直接返回right
。具体可分为两种情况:p
,q
其中一个在root
的右子树中,此时right
指向p
(假设为p
);p
,q
两节点都在root
的右子树中,此时的right
指向最近公共祖先节点 ;
当
left
不为空,right
:与情况3.
同理;
- 当
代码
1 | class Solution { |