剑指offer-4
剑指 Offer 60. n个骰子的点数 - 力扣(LeetCode)
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。
1 | class Solution { |
剑指 Offer 62. 圆圈中最后剩下的数字 - 力扣(LeetCode)
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
1 | // n-1约瑟夫环的索引index(n-1) 删除一个数后的n约瑟夫环索引index(n) |
剑指 Offer 63. 股票的最大利润 - 力扣(LeetCode)
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
动态规划的思想,分别记录买入的最小值dp[i][0]
和利润最大值dp[i][1]
1 | class Solution { |
剑指 Offer 64. 求1+2+…+n - 力扣(LeetCode)
求 1+2+...+n
,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
常规方法,使用while
1 | class Solution { |
递归的算法,&&实现类似if的效果,如果不满足n > 1就退出递归。
1 | class Solution { |
剑指 Offer 65. 不用加减乘除做加法 - 力扣(LeetCode)
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
1 | class Solution { |
剑指 Offer 66. 构建乘积数组 - 力扣(LeetCode)
给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。
因为不能用除法,把数组分成上三角和下三角两个部分,在将两部分乘起来就是最终的结果。
1 | class Solution { |
剑指 Offer 67. 把字符串转换成整数 - 力扣(LeetCode)
1 | class Solution { |
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 - 力扣(LeetCode)
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
递归法:判断节点的值和p,q比较,如果在p,q之间说明此节点就是祖先,否则就会找根节点的左孩子或者右孩子。
1 | /** |
剑指 Offer 68 - II. 二叉树的最近公共祖先 - 力扣(LeetCode)
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
注意这一题是二叉树,上一题是二叉搜索树。
1 | /** |
面试题13. 机器人的运动范围 - 力扣(LeetCode)
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?
根据题目描述可以知道是用深度优先或者广度优先算法来解决问题。
深度优先算法思路如下:注意要加上visited数组作为标记确定哪些位置已经访问过了,否则可能会出现重复访问的情况。
1 | //注意要对遍历过的进行标记,否则会有重复输出 |
面试题45. 把数组排成最小的数 - 力扣(LeetCode)
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
1 | class Solution { |
面试题59 - II. 队列的最大值 - 力扣(LeetCode)
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1
实际上还是单调队列的思想,用一个maxque从front到back存储从大到小的数据。
1 | class MaxQueue { |
从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
其实就是不管0,不重复而且最大和最小的差值小于5即可构成顺子。
1 | class Solution { |