![](https://img-blog.csdnimg.cn/f3c1b568df854c92acb8306a891b8d03.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
剑指offer进阶
刷题笔记
龙崎流河
沉淀
展开
-
剑指offer118:多余的边
题目:树可以看成是一个连通且 无环 的 无向 图。给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi] 表示图中在 ai 和 bi 之间存在一条边。请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的边。分析:代码:...原创 2022-04-25 20:35:33 · 322 阅读 · 0 评论 -
剑指offer116:省份数量
题目:有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。返回矩阵中 省份 的数量。示例一:输入:isConnec原创 2022-04-25 16:42:06 · 224 阅读 · 0 评论 -
剑指offer115:重建序列
题目:请判断原始的序列 org 是否可以从序列集 seqs 中唯一地 重建 。序列 org 是 1 到 n 整数的排列,其中 1 ≤ n ≤ 104。重建 是指在序列集 seqs 中构建最短的公共超序列,即 seqs 中的任意序列都是该最短序列的子序列。示例 1:输入: org = [1,2,3], seqs = [[1,2],[1,3]]输出: false解释:[1,2,3] 不是可以被重建的唯一的序列,因为 [1,3,2] 也是一个合法的序列。示例 2:输入: org = [1,2,3原创 2022-04-07 15:03:36 · 596 阅读 · 1 评论 -
剑指offer113:课程顺序
题目:现在总共有 numCourses 门课需要选,记为 0 到 numCourses-1。给定一个数组 prerequisites ,它的每一个元素 prerequisites[i] 表示两门课程之间的先修顺序。 例如 prerequisites[i] = [ai, bi] 表示想要学习课程 ai ,需要先完成课程 bi 。请根据给出的总课程数 numCourses 和表示先修顺序的 prerequisites 得出一个可行的修课序列。可能会有多个正确的顺序,只要任意返回一种就可以了。如果不可能原创 2022-04-06 13:47:08 · 777 阅读 · 0 评论 -
剑指offer110:所有路径
题目:给定一个有 n 个节点的有向无环图,用二维数组 graph 表示,请找到所有从 0 到 n-1 的路径并输出(不要求按顺序)。graph 的第 i 个数组中的单元都表示有向图中 i 号节点所能到达的下一些结点(译者注:有向图是有方向的,即规定了 a→b 你就不能从 b→a ),若为空,就是没有下一个节点了。示例一:输入:graph = [[1,2],[3],[3],[]]输出:[[0,1,3],[0,2,3]]解释:有两条路径 0 -> 1 -> 3 和 0 -> 2原创 2022-04-05 14:34:08 · 151 阅读 · 0 评论 -
剑指offer109:开密码锁
题目:一个密码锁由 4 个环形拨轮组成,每个拨轮都有 10 个数字: ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转:例如把 ‘9’ 变为 ‘0’,‘0’ 变为 ‘9’ 。每次旋转都只能旋转一个拨轮的一位数字。锁的初始数字为 ‘0000’ ,一个代表四个拨轮的数字的字符串。列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。字符串 target 代表可以解锁原创 2022-04-04 23:11:03 · 835 阅读 · 0 评论 -
剑指offer107:矩阵中的距离
题目:给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。两个相邻元素间的距离为 1 。示例一:输入:mat = [[0,0,0],[0,1,0],[0,0,0]]输出:[[0,0,0],[0,1,0],[0,0,0]]示例二:输入:mat = [[0,0,0],[0,1,0],[1,1,1]]输出:[[0,0,0],[0,1,0],[1,2,1]]分析:由于这个问题与无权图的最近距离相关,因此可以考虑原创 2022-03-30 16:43:36 · 800 阅读 · 0 评论 -
剑指offer106:二分图
题目:存在一个 无向图 ,图中有 n 个节点。其中每个节点都有一个介于 0 到 n - 1 之间的唯一编号。给定一个二维数组 graph ,表示图,其中 graph[u] 是一个节点数组,由节点 u 的邻接节点组成。形式上,对于 graph[u] 中的每个 v ,都存在一条位于节点 u 和节点 v 之间的无向边。该无向图同时具有以下属性:不存在自环(graph[u] 不包含 u)。不存在平行边(graph[u] 不包含重复值)。如果 v 在 graph[u] 内,那么 u 也应该在 graph[v原创 2022-03-30 12:24:53 · 162 阅读 · 0 评论 -
剑指offer105:最大的岛屿
题目:给定一个由 0 和 1 组成的非空二维数组 grid ,用来表示海洋岛屿地图。一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。找到给定的二维数组中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。示例一:输入: grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0原创 2022-03-29 17:19:36 · 139 阅读 · 0 评论 -
剑指offer103:最少的硬币数目
题目:给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。示例一:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1示例二:输入:coins = [2], amount = 3输出:-1示例三:输入:coins = [1], amount = 0输出:0示例四:输入:coins原创 2022-03-07 21:39:19 · 317 阅读 · 0 评论 -
剑指offer102:加减的目标值
题目:给定一个正整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。示例一:输入:nums = [1,1,1,1,1], target = 3输出:5解释:一共有 5 种方法让最终目标和为 3原创 2022-03-04 22:21:33 · 129 阅读 · 0 评论 -
剑指offer101:分割等和子集
题目:给定一个非空的正整数数组 nums ,请判断能否将这些数字分成元素和相等的两部分。示例一:输入:nums = [1,5,11,5]输出:true解释:nums 可以分割成 [1, 5, 5] 和 [11] 。示例二:输入:nums = [1,2,3,5]输出:false解释:nums 不可以分为和相等的两部分分析:状态转移方程:函数f(i,j)表示能否从前i个物品(标号为0,1,…,i-1),中选择若干物品放满容量为j的背包,如果共有n个物品,背包容量为t,那么f(n,t)就是原创 2022-03-03 16:24:07 · 630 阅读 · 0 评论 -
剑指offer100:三角形中最小路径之和
题目:给定一个三角形 triangle ,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。示例一:输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]输出:11解释:如下面简图所示:23 46 5 74 1 8 3自顶向下的最小路径和为 11原创 2022-03-03 12:36:40 · 267 阅读 · 0 评论 -
剑指offer99:最小路径之和
题目:给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:一个机器人每次只能向下或者向右移动一步。示例一:输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。示例2:输入:grid = [[1,2,3],[4,5,6]]输出:12分析:该题思路与98题类似,具体不再赘述,找到状态转移方程就可轻松解题。状态转移方程f(i,j)等于f(i-1,原创 2022-03-02 11:07:27 · 92 阅读 · 0 评论 -
剑指offer98:路径的数目
题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例1:输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。向右 -> 向下 -> 向下向下 -> 向下 -> 向右向下 -> 向右 -> 向下示例2:输入:m = 7, n = 3原创 2022-02-28 11:14:43 · 108 阅读 · 0 评论 -
剑指offer96:字符串交织
题目:给定三个字符串 s1、s2、s3,请判断 s3 能不能由 s1 和 s2 交织(交错) 组成。两个字符串 s 和 t 交织 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:s = s1 + s2 + … + snt = t1 + t2 + … + tm|n - m| <= 1交织 是 s1 + t1 + s2 + t2 + s3 + t3 + … 或者 t1 + s1 + t2 + s2 + t3 + s3 + …提示:a + b 意味着字符串 a 和 b 连接。原创 2022-02-27 12:08:42 · 389 阅读 · 0 评论 -
剑指offer95:最长公共子序列
题目:给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。示例一:输入:text1 = “abcde”, text2 =原创 2022-02-15 17:53:42 · 350 阅读 · 0 评论 -
剑指offer93:最长斐波那契数列
题目:如果序列 X_1, X_2, …, X_n 满足下列条件,就说它是 斐波那契式 的:n >= 3对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2}给定一个严格递增的正整数数组形成序列 arr ,找到 arr 中最长的斐波那契式的子序列的长度。如果一个不存在,返回 0 。(回想一下,子序列是从原序列 arr 中派生出来的,它从 arr 中删掉任意数量的元素(也可以不删),而不改变其余元素的顺序。例如, [3, 5, 8] 是 [3, 4,原创 2022-02-14 16:25:34 · 223 阅读 · 0 评论 -
剑指offer92:翻转字符
题目:如果一个由 ‘0’ 和 ‘1’ 组成的字符串,是以一些 ‘0’(可能没有 ‘0’)后面跟着一些 ‘1’(也可能没有 ‘1’)的形式组成的,那么该字符串是 单调递增 的。我们给出一个由字符 ‘0’ 和 ‘1’ 组成的字符串 s,我们可以将任何 ‘0’ 翻转为 ‘1’ 或者将 ‘1’ 翻转为 ‘0’。返回使 s 单调递增 的最小翻转次数。示例一:输入:s = “00110”输出:1解释:我们翻转最后一位得到 00111.示例二:输入:s = “010110”输出:2解释:我们翻转得到原创 2022-02-13 20:48:36 · 261 阅读 · 0 评论 -
剑指offer91:粉刷房子
题目:假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵 costs 来表示的。例如,costs[0][0] 表示第 0 号房子粉刷成红色的成本花费;costs[1][2] 表示第 1 号房子粉刷成绿色的花费,以此类推。请计算出粉刷完所有房子最少的花费成本。示例一原创 2022-02-12 18:28:17 · 126 阅读 · 0 评论 -
剑指offer90:环形房屋偷盗
题目:一个专业的小偷,计划偷窃一个环形街道上沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组 nums ,请计算 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。示例 1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金原创 2022-02-11 21:36:04 · 568 阅读 · 0 评论 -
剑指offer89:房屋偷盗
题目:一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响小偷偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组 nums ,请计算 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例一:输入:nums = [1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例二原创 2022-02-11 20:45:12 · 123 阅读 · 0 评论 -
剑指offer88:爬楼梯的最少成本
题目:数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。每当爬上一个阶梯都要花费对应的体力值,一旦支付了相应的体力值,就可以选择向上爬一个阶梯或者爬两个阶梯。请找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。1.输入:cost = [10, 15, 20]输出:15解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。2.输入:cost = [1, 100, 1原创 2022-01-14 14:35:55 · 230 阅读 · 0 评论 -
剑指offer87:恢复IP地址
题目:给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。1.输入:s = “2552551原创 2022-01-12 20:51:57 · 243 阅读 · 0 评论 -
剑指offer86:分割回文子字符串
题目:给定一个字符串 s ,请将 s 分割成一些子串,使每个子串都是 回文串 ,返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。输入:s = “google”输出:[[“g”,“o”,“o”,“g”,“l”,“e”],[“g”,“oo”,“g”,“l”,“e”],[“goog”,“l”,“e”]]输入:s = “aab”输出:[[“a”,“a”,“b”],[“aa”,“b”]]输入:s = “a”输出:[[“a”]]提示:1 <= s.length <=原创 2022-01-10 22:24:46 · 484 阅读 · 0 评论 -
剑指offer85:生成匹配的括号
题目:正整数 n 代表生成括号的对数,请设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。1.输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]2.输入:n = 1输出:["()"]分析:需要注意的是每一步的限制条件,第1个限制条件是左括号或者右括号不能超过n个,第2个限制条件是括号的匹配原则,也就是在任意步骤中已经生成的右括号的数目不能超过左括号的数目。代码:import java.util.LinkedList;原创 2022-01-09 22:09:49 · 3460 阅读 · 0 评论 -
剑指offer84:包含重复元素集合的全排列
题目:给定一个可包含重复数字的整数集合 nums ,按任意顺序 返回它所有不重复的全排列。1.输入:nums = [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]2.输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]分析:该题与83题的不同点在于如果集合中有重复的数字,那么交换集合中重复的数字得到的全排列是同一个全排列。思路与83题基本一致,不再赘述,只说不同之处。当处理到全原创 2022-01-04 12:54:53 · 376 阅读 · 0 评论 -
剑指offer83:没有重复元素集合的全排列
题目:给定一个不含重复数字的整数数组 nums ,返回其 所有可能的全排列 。可以 按任意顺序 返回答案。1.输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]2.输入:nums = [0,1]输出:[[0,1],[1,0]]3.输入:nums = [1]输出:[[1]]分析:排列不同于组合,排列和元素的顺序相关,交换数字能够得到不同的排列。生成全排列的过程就是交换输入集合中元素的顺序以得到不同的排列。原创 2022-01-04 11:50:37 · 548 阅读 · 0 评论 -
剑指offer82:含有重复元素集合的组合
题目:给定一个可能有重复数字的整数数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次,解集不能包含重复的组合。1.输入: candidates = [10,1,2,7,6,1,5], target = 8,输出:[[1,1,6],[1,2,5],[1,7],[2,6]]2.输入: candidates = [2,5,2,1,2], target =原创 2022-01-03 12:03:37 · 419 阅读 · 0 评论 -
剑指offer81:允许重复选择元素的组合
题目:给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。对于给定的输入,保证和为 target 的唯一组合数少于 150 个。1.输入: candidates = [2,3,6,7], target = 7输出: [[7],[2,2,3]]2.输入: candidates = [2原创 2022-01-02 12:13:40 · 153 阅读 · 0 评论 -
剑指offer80:包含k个元素的组合
**题目:**给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。输入: n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]输入: n = 1, k = 1输出: [[1]]解析:该题的思路和剑指offer79题大致相同,这是上一题的思路图:如果n=3,k=2,找到所有k个数的组合,那在上一题的基础上筛选就可以了,比如画红圈的地方。代码:import java.util.LinkedList;原创 2022-01-02 11:00:00 · 221 阅读 · 0 评论 -
剑指offer79:所有子集(回溯法)
题目:给定一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按 任意顺序 返回解集。输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]输入:nums = [0]输出:[[],[0]]分析:具体操作详见注释如果输入的集合有n个元素,由于每个元素都有2个选项,因此总的时间复杂度是O(2^n)。代码:import java.util.LinkedLis原创 2021-12-11 18:34:53 · 477 阅读 · 0 评论 -
剑指offer77:链表排序(归并排序)
题目:给定链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。输入:head = [4,2,1,3]输出:[1,2,3,4]输入:head = [-1,5,3,4,0]输出:[-1,0,3,4,5]分析:代码:原创 2021-12-11 13:15:19 · 1798 阅读 · 0 评论 -
剑指offer76:数组中第k大的数字(快速排序)
题目:给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。输入: [3,2,1,5,6,4] 和 k = 2输出: 5输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4简单回顾快速排序原序列是[4,1,5,3,6,2,7,8]直接上图片和代码a图选取3作为中间值,将其交换到数的尾部,初始化p1指针到下标为-1的位置,指针p2至下标为0的位置,b图右移指针p2直到遇到原创 2021-12-05 00:36:37 · 421 阅读 · 0 评论 -
剑指offer75:数组相对排序(计数排序思想)
题目:给定两个数组,arr1 和 arr2,arr2 中的元素各不相同arr2 中的每个元素都出现在 arr1 中对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]输出:[2,2,2,1,4,3,3,9,6,7,19]提示:1 <= arr1.length, arr2.原创 2021-11-30 13:14:17 · 351 阅读 · 0 评论 -
剑指offer74:合并区间
题目:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].输入:intervals = [[1,4],[4,5]]输出:[[1,原创 2021-11-30 00:19:37 · 287 阅读 · 0 评论 -
剑指offer73:狒狒吃香蕉
题目:狒狒喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。狒狒可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更 多的香蕉,下一个小时才会开始吃另一堆的香蕉。狒狒喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。输入: piles = [3,6,7,11原创 2021-11-28 11:56:15 · 815 阅读 · 1 评论 -
剑指offer72:求平方根
题目:给定一个非负整数 x ,计算并返回 x 的平方根,即实现 int sqrt(int x) 函数。正数的平方根有两个,只输出其中的正数平方根。如果平方根不是整数,输出只保留整数的部分,小数部分将被舍去。输入: x = 8输出: 2解释: 8 的平方根是 2.82842…,由于小数部分将被舍去,所以返回 2输入: x = 4输出: 2分析:假如输入的非负整数是n,从0开始每次增加1,对于每个整数m,判断m^2是否小于或等于n,如果找到一个m,并且满足m ^2 <=n 和(m+1)原创 2021-11-27 09:45:19 · 254 阅读 · 0 评论 -
剑指offer71:按权重生成随机数
题目:给定一个正整数数组 w ,其中 w[i] 代表下标 i 的权重(下标从 0 开始),请写一个函数 pickIndex ,它可以随机地获取下标 i,选取下标 i 的概率与 w[i] 成正比。例如,对于 w = [1, 3],挑选下标 0 的概率为 1 / (1 + 3) = 0.25 (即,25%),而选取下标 1 的概率为 3 / (1 + 3) = 0.75(即,75%)。也就是说,选取下标 i 的概率为 w[i] / sum(w) 。分析:若权重数组是[1,2,3,4],那么权重之和就是原创 2021-11-26 23:18:06 · 750 阅读 · 0 评论 -
剑指offer70:排序数组中只出现一次的数字
题目:给定一个只包含整数的有序数组 nums ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。输入: nums = [1,1,2,3,3,4,4,8,8]输出: 2输入: nums = [3,3,7,7,10,11,11]输出: 10分析:可以将数组中的所有数字进行异或操作,最后得到的数字就是唯一出现的数字,时间复杂度为O(n)。题目中还有一个条件没有利用上,就是数组是排序好的,因此可以换一个角度来看待这个数组,如果所有数字都出现了两次,那么将数组中的数字每两个分为一原创 2021-11-26 22:38:10 · 533 阅读 · 0 评论