力扣算法题
刷题笔记
桃花er
在读计算机学生
通过此博客来记录自己的学习路程
分享知识,提升自己
展开
-
力扣数组专题总结
刷了差不多14天两个礼拜的数组题了,一天刷两道总共28题,做个总结8…一. 数组题目分类 题目编号①数组的遍历 485、495、414、628②统计数组中的元素 645、697(未完成)、448、442、41、274③数组的改变、移动 453、665、283④二维数组及滚动数组 118、119、661、598、419⑤数组的旋转 189、396(未完成)⑥特定顺序遍历二维数组 54、59、498(未完成)⑦二维数组变换 566、48、73、289⑧前缀和数组 303、304、238原创 2021-01-30 16:42:19 · 305 阅读 · 0 评论 -
力扣238题:除自身以外的数组的乘积
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。 进阶: 你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)示例:输入: [1,2,3,4]输出: [原创 2021-01-29 11:07:15 · 174 阅读 · 0 评论 -
力扣304题:二维区域和检索
给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。示例:给定 matrix = [[3, 0, 1, 4, 2],[5, 6, 3, 2, 1],[1, 2, 0, 1, 5],[4, 1, 0, 1, 7],[1, 0, 3, 0, 5]]sumRegion(2, 1, 4, 3) -> 8sumRegion(1, 1, 2, 2) -> 11sumRegion(1, 2, 2, 4) -原创 2021-01-29 10:52:23 · 198 阅读 · 0 评论 -
力扣303题:区域和检索
给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。示例:输入:[“NumArray”, “sumRange”, “sumRange”, “sumRange”][[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]输出:[null, 1, -1, -3]解释:NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);numArray.s原创 2021-01-28 12:58:25 · 234 阅读 · 0 评论 -
力扣289题:生命游戏
根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;如果活细胞周围八个位置有超过三个活细胞,则该位原创 2021-01-28 12:25:13 · 407 阅读 · 0 评论 -
力扣73题:矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。示例 1:输入:[[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]难度:中等。算法思路:蛮力,将有0的行和列标记为一个特殊的值,然后再将其变为0,我设置的值是Integer.MIN_VALUE,不过测试样例中输入矩阵中有值为Integer.MIN_VALUE,在160/164个样例被卡了,虽然可以面向测试用例来编程,原创 2021-01-26 15:17:03 · 234 阅读 · 0 评论 -
力扣48题:旋转图像
给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。给定 matrix =[[1,2,3],[4,5,6],[7,8,9]],原地旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]这道题力扣给的难度是中等。算法思路:我发现这道中等题居然通过率达到72%,而且题目要求直接在原矩阵上进行操作,也就是说不要使用另一个举证来旋转图像。直接利用原创 2021-01-26 14:45:18 · 202 阅读 · 0 评论 -
力扣566题:重塑矩阵
给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵示例 1:输入:nums =[[1,2],[3,4]]r = 1, c = 4输出:[[1,2,3,4]]解释:行遍历nums的结果是 [1,2,3,4]。新的矩阵是 1 * 4 矩阵, 用之前的元素值一行一行填充新矩阵示例 2:输入:nu原创 2021-01-25 12:58:55 · 174 阅读 · 0 评论 -
力扣59题:螺旋矩阵Ⅱ
给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。示例:输入: 3输出:[[ 1, 2, 3 ],[ 8, 9, 4 ],[ 7, 6, 5 ]]这个题力扣给的难度是中等。算法思路:其实在做完力扣54题,这题就很简单了,之前我在学习算法的时候也写过这道题,不过当时是采用递归完成的,这次用DFS去完成它,其实稍微在54题的代码上更改一下就可以了。class Solution { public int[][] generateMa原创 2021-01-24 18:01:21 · 241 阅读 · 0 评论 -
力扣54题:螺旋矩阵
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:输入:[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]这道题力扣给的难度是中等。(15年吉林大学软件工程考研真题)算法思路:拿到题的第一反应就是递归求解了,然后就是DFS深度优先搜索,当然有了思路到编码部分还是有点困难的…虽然以前有写过有关DFS的程序,但是不是很熟练,这里稍微改了一下官方题解的DFS原创 2021-01-24 17:46:22 · 311 阅读 · 0 评论 -
力扣396题:旋转函数
给定一个长度为 n 的整数数组 A 。假设 Bk 是数组 A 顺时针旋转 k 个位置后的数组,我们定义 A 的“旋转函数” F 为:F(k) = 0 * Bk[0] + 1 * Bk[1] + … + (n-1) * Bk[n-1]。计算F(0), F(1), …, F(n-1)中的最大值。注意:可以认为 n 的值小于 105。示例:A = [4, 3, 2, 6]F(0) = (0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) = 0 + 3 + 4 + 18 = 25F原创 2021-01-23 14:33:44 · 175 阅读 · 1 评论 -
力扣189题:旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]这道题力扣给的难度是中等。算法思路:①最容易想到的就是两边for循环,内层for循环将每一个元素后移一位,外层for循环将执行k此内层for循环,达原创 2021-01-23 13:57:56 · 169 阅读 · 0 评论 -
力扣419题:甲板上的战舰
给定一个二维的甲板, 请计算其中有多少艘战舰。 战舰用 'X’表示,空位用 '.'表示。 你需要遵守以下规则:给你一个有效的甲板,仅由战舰或者空位组成。战舰只能水平或者垂直放置。换句话说,战舰只能由 1xN (1 行, N 列)组成,或者 Nx1 (N 行, 1 列)组成,其中N可以是任意大小。两艘战舰之间至少有一个水平或垂直的空位分隔 - 即没有相邻的战舰。进阶:你可以用一次扫描算法,只使用O(1)额外空间,并且不修改甲板的值来解决这个问题吗?示例 :X . . X. . . X. . .原创 2021-01-22 13:10:36 · 260 阅读 · 0 评论 -
力扣598题:范围求和Ⅱ
给定一个初始元素全部为 0,大小为 m*n 的矩阵 M 以及在 M 上的一系列更新操作。操作用二维数组表示,其中的每个操作用一个含有两个正整数 a 和 b 的数组表示,含义是将所有符合 0 <= i < a 以及 0 <= j < b 的元素 M[i][j] 的值都增加 1。在执行给定的一系列操作后,你需要返回矩阵中含有最大整数的元素个数。示例 1:输入:m = 3, n = 3operations = [[2,2],[3,3]]输出: 4解释:初始状态, M =[原创 2021-01-22 12:07:25 · 112 阅读 · 0 评论 -
力扣661题:图片平滑器
包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多的利用它们。示例 1:输入:[[1,1,1],[1,0,1],[1,1,1]]输出:[[0, 0, 0],[0, 0, 0],[0, 0, 0]]解释:对于点 (0,0), (0,2), (2,0), (2,2): 平均(3/4) = 平均(0.75) = 0对于点 (0,1), (1原创 2021-01-21 12:44:58 · 119 阅读 · 0 评论 -
力扣119题:杨辉三角Ⅱ
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。进阶:你可以优化你的算法到 O(k) 空间复杂度吗?示例:输入: 3输出: [1,3,3,1]这个题力扣给的难度是简单。当然如果不用优化到O(k)的话,这个题可以直接套用118题的板子再来一遍就可以了,但是因为空间复杂度受到限制,就需要想一种更好一点的算法。算法思路:看到这个题的时候我是懵的,因为我不知道如何才能把它优化到O(k),然后经过评论区一番遨游之后发现出现了一种新的思路(当然有大神去打表…不过我觉得没有必要,因为原创 2021-01-21 11:45:38 · 225 阅读 · 0 评论 -
力扣118题:杨辉三角
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。这道题力扣给的难度是简单。这种题做过很多次了,就是一个很简单的找规律,从第三行开始新的元素等于上面两个元素的和。class Solution { public List<List<Integer>> generate(int numRows) { List<List<Integer>> ret = new ArrayList<List<Integ原创 2021-01-20 12:22:12 · 261 阅读 · 0 评论 -
力扣283题:移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]这道题力扣给的难度是简单。算法思路:两次遍历,第一次遍历去找寻不是0的元素,然后顶替到第target个位置上,然后第二次遍历从target位置到nums.length-1的位置全部赋值为0即可。class Solution { public void moveZeroes(int[] nums) { int原创 2021-01-20 11:28:05 · 96 阅读 · 0 评论 -
力扣665题:非递减数列
给你一个长度为 n 的整数数组,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。我们是这样定义一个非递减数列的: 对于数组中所有的 i (0 <= i <= n-2),总满足 nums[i] <= nums[i + 1]示例 1:输入: nums = [4,2,3]输出: true解释: 你可以通过把第一个4变成1来使得它成为一个非递减数列。示例 2:输入: nums = [4,2,1]输出: false解释: 你不能在只改变一个元素的情况下将其原创 2021-01-19 13:05:46 · 108 阅读 · 0 评论 -
力扣453题:最小操作次数使数组元素相等
给定一个长度为 n 的 非空 整数数组,每次操作将会使 n - 1 个元素增加 1。找出让数组所有元素相等的最小操作次数。示例:输入:[1,2,3]输出:3解释:只需要3次操作(注意每次操作会增加两个元素的值):[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]这道题力扣给的难度是简单。(据说是深信服的笔试题…乍一眼看仿佛被吓到了,感觉一次变换的数字有点多,不过仔细一想,操作n-1个数加1不就相当于操作1个数减1吗,相对论,原创 2021-01-19 11:43:18 · 898 阅读 · 0 评论 -
力扣274题:H指数
给定一位研究者论文被引用次数的数组(被引用次数是非负整数)。编写一个方法,计算出研究者的 h 指数。h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。且其余的 N - h 篇论文每篇被引用次数 不超过 h 次。例如:某人的 h 指数是 20,这表示他已发表的论文中,每篇被引用了至少 20 次的论文总共有 20 篇输入:citations = [3,0,6,1,5]输出:3解释:给原创 2021-01-18 13:08:38 · 378 阅读 · 0 评论 -
力扣41:缺失的第一个正数
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。进阶:你可以实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案吗?示例 1:输入:nums = [1,2,0]输出:3示例 2:输入:nums = [3,4,-1,1]输出:2这个题力扣给的难度是困难。算法思路:有一说一,第一反应是跟前面两道题的方法几乎无异,都是通过遍历来找数组下标和数组元素的关系然后再找最小的正整数,但是这个题的nums[i]的取值居然是-2^31 <= nums[i] &原创 2021-01-18 11:47:32 · 210 阅读 · 0 评论 -
力扣442题:数组中重复的数据
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?示例:输入:[4,3,2,7,8,2,3,1]输出:[2,3]这个题力扣给的难度是中等。算法思路:通过上一题力扣448题学会了新的思路后显得这题特别的简单了,可以说是换汤不换药吧,这两个题思路都是一样的,在原数组的基础上,不增加额外的空间,然后找到数组下标和数组元素之间的关系即可解出答案。通原创 2021-01-17 14:26:54 · 378 阅读 · 0 评论 -
力扣448题:找到所有数组中消失的数字
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。示例:输入:[4,3,2,7,8,2,3,1]输出:[5,6]这个题力扣给的难度是简单。但我一点都不觉得简单啊…其实这个题跟之前的题很相像,利用桶排序一下子就能解出来了,但是题目要求要在不使用额外空原创 2021-01-17 12:44:21 · 172 阅读 · 0 评论 -
力扣697:数组的度
给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。示例 1:输入: [1, 2, 2, 3, 1]输出: 2解释:输入数组的度是2,因为元素1和2的出现频数最大,均为2.连续子数组里面拥有相同度的有如下所示:[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]最短连续子数组[原创 2021-01-16 12:04:49 · 127 阅读 · 0 评论 -
力扣645题:错误的集合
集合 S 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回示例:输入:nums = [1,2,2,4]输出:[2,3]这个题力扣给的难度是简单。算法思路:看到这个题第一个就想到了桶排序,通过循环遍历整个数组然后在标记桶。然后再遍历桶数组去看哪一个桶是0,哪原创 2021-01-16 11:28:22 · 276 阅读 · 0 评论 -
力扣628题:三个数的最大乘积
给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。示例 1:输入: [1,2,3]输出: 6这个题力扣给的难度是简单。算法思路这道题在上算法课的时候有讲过,最容易想到的还是排序,不过有个更好的算法可以优化到时间复杂度为O(n)。其实跟上一题414的最后一个算法思路差不多,就是设置五个变量max1,max2,max3,min1,min2,因为三个数组成的最大乘积只可能是两个最小值乘上一个最大值或者是三个最大值相乘。然后遍历数组中的每一个数字,对这五个变量进行更新,这道题相对原创 2021-01-15 14:33:00 · 210 阅读 · 0 评论 -
力扣414题:第三大的数
给你一个非空数组,返回此数组中第三大的数 。如果不存在,则返回数组中最大的数。输入:[3, 2, 1]输出:1解释:第三大的数是 1 。这个题力扣给的难度是简单。一拿到题第一个想到的就是排序,不过很显然用排序的话效率会很低,题目建议将时间复杂度优化到O(n),不过还是先把题目写出来再去优化吧。错误的算法思路:先判断这个数组有多长,如果小于3就另作判断,大于3就将其按递增排序后选择倒数第三个数字即为答案。然而我又被锤了这次是没读清楚题目的意思,题目要求返回的是第三大的数字,这个数组中是有可原创 2021-01-15 13:57:02 · 302 阅读 · 0 评论 -
力扣495题:提莫攻击
题目描述:在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。现在,给出提莫对艾希的攻击时间序列和提莫攻击的中毒持续时间,你需要输出艾希的中毒状态总时长。你可以认为提莫在给定的时间点进行攻击,并立即使艾希处于中毒状态。示例1:输入: [1,4], 2输出: 4原因: 第 1 秒初,提莫开始对艾希进行攻击并使其立即中毒。中毒状态会维持 2 秒钟,直到第 2 秒末结束。第 4 秒初,提莫再次攻击艾希,使得艾希获得另外 2 秒中毒时间。所原创 2021-01-14 17:45:18 · 228 阅读 · 1 评论 -
力扣485题:最大连续1的个数
给定一个二进制数组, 计算其中最大连续1的个数。示例 1:输入: [1,1,0,1,1,1]输出: 3解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.这道题力扣给的难度是easy。算法思路:通过一个循环来遍历整个数组,如果有连续的1就让计数器记着,如果不是就让计数器清零。设置一个max变量,如果这次遍历的连续的1比上次遍历的多就改变max的值,最后返回max。源码部分:时间复杂度为O(n),空间复杂度为O(1);public int findMaxConsecuti原创 2021-01-14 17:04:39 · 258 阅读 · 0 评论 -
力扣plan
从今天开始刷力扣,争取一天刷两道吧,先刷一个月试试,今天2021年1月14日,刷到除夕夜2月11日也就是正好四周28天,应该会刷完56道左右吧哈哈,立个flag原创 2021-01-14 16:43:16 · 102 阅读 · 0 评论