![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数组
文章平均质量分 63
数组及归纳方法
辰阳星宇
这个作者很懒,什么都没留下…
展开
-
202、【数组】leetcode ——2588. 统计美丽子数组数目(C++版本)
使用一个哈希表,key为前缀和,value为具有该前缀和的个数。因为是要找到所有的满足异或后为0的子区间,因此,需要的就是对相同的前缀和进行两两配对,便计算出了所有情况。规定前缀和为异或运算后的前缀和,只要找到前缀和相同的两个位置,此时这两个位置之间的区间,异或后就一定为0。因此,问题就转化为了找到一个一个区间内,所有的数进行异或操作后数值变为0。本题的难点在于对于题意的解析与思路的转化。(异或运算:对相同为0,相异为1,0与任何数计算该数数值保持不变),而前缀和是处理子区间内数值的常用方式。原创 2023-03-13 17:20:57 · 449 阅读 · 0 评论 -
201、【数组】leetcode ——面试题 17.05. 字母与数字(C++版本)
参考文章:字母与数字原创 2023-03-13 13:01:30 · 263 阅读 · 0 评论 -
200、【数组】leetcode ——6316. 重排数组以得到最大前缀分数(C++版本)
排序找前缀和为正数的个数原创 2023-03-12 20:27:05 · 85 阅读 · 0 评论 -
182、【动态规划/数组】leetcode ——647. 回文子串:动态规划+双指针(C++版本)
判定是否为回文串。当子串为奇数长度时,回文串中心唯一;当子串为偶数长度时,会由两个数作为回文串中心。如此时子串长度超过2时,则需要根据上一次i与j之间的位置结果进行判定,若。dp[i][j] = false,都为进行判定时,为false。因为每次子串为从两边向中间伸缩,因此为从下至上,从左至右。bool类型变量,s中下标i到下标j之间是否为回文串。,则再加上当前的情况一定为回文串,执行。时,若此时子串的长度为1或2时(),此时一定为回文串,执行。动态规划的思路是每次判定。两个状态,三种操作。原创 2023-02-25 17:00:52 · 296 阅读 · 0 评论 -
178、【数组/动态规划】leetcode ——392. 判断子序列:双指针+动态规划(C++版本)
的时候,因为要求字符串s为t的子串,因此固定s末尾指向位置不动,让指向t的指针向前面移动一个,由此位置转移状态,即。由此方式,遍历完整个字符串。的时候,从上一个状态转移过来,的过程中,每遇到一个。指向元素相等时,则让。原创 2023-02-23 17:43:34 · 103 阅读 · 0 评论 -
141、【贪心算法】leetcode ——56. 合并区间(区间重叠解法+双指针解法)(C++版本)
先按左边界从小打到排序,每次前后两个区间对比,无重叠则将前面的区间加入结果集,有重叠则将两个区间合并。对最后一个区间大度处理。i ++) {// 无重叠,将前面的加入 res . push_back(intervals [ i - 1 ]);} else {// 有重叠,将前面的合并 intervals [ i ] [ 0 ] = intervals [ i - 1 ] [ 0 ];原创 2023-02-04 23:06:15 · 371 阅读 · 0 评论 -
105、【树与二叉树】leetcode ——530. 二叉搜索树的最小绝对差:中序遍历递归法+迭代法(C++版本)
利用BST的特性,采用中序遍历的方式,可以得到单调递增的元素。原创 2023-01-17 11:32:25 · 89 阅读 · 0 评论 -
104、【树与二叉树】leetcode ——98. 验证二叉搜索树:递归法[先序+中序+后序]+迭代法(C++版本)
BST的特点是:当前结点的值,比左子树中的全部结点都大,比右子树中全部结点都小。在代码实现中,要注意不要对比的是某一结点和某一侧的全部值之间的关系,不能只有结点与结点间的关系对比,否则容易出现非法BST。对于第一种情况,左子树的左子树结点,只要其左结点比当前结点小即可。根据BST的特点,当对BST进行中序遍历时,结点的值应呈单调递增的形式。,记录上一个遍历元素的值,若为BST,则当前的值,应大于上一个遍历的值。BST要保证,当前节点全部大于左子树中的结点,全部小于右子树中的结点。原创 2023-01-16 23:25:59 · 387 阅读 · 0 评论 -
86、【栈与队列】leetcode ——39. 滑动窗口最大值:单调队列+滑动窗口(C++版本)
本题的特点是维护一个窗口,在窗口不断向前移动时,获取其中的最大值。由于窗口在向前移动过程中,元素存在着进入和出去的连续顺序,与FIFO的特点类似。在移动窗口的过程中,当队头元素与移除元素相同时,则弹出。然后将进入窗口的元素加入到队内,每次都将队头中的最大值加入到结果集中。加入元素,当已存入的队尾元素比待加入元素小时,弹出旧元素,直至队尾当前指向元素大于或等于待加入元素时,将其加入队尾,从而实现。中的最大值元素而已,并不需要对所有添加过的元素都进行维护,因此我们可使用。可保证维护对顺序的时间复杂度为。原创 2023-01-09 19:26:00 · 489 阅读 · 0 评论 -
【算法刷题】数组题型及方法归纳
1. 二分查找:双指针法[左右]二分查找(C++、Python3)39、【查找】二分查找:数的范围和查找某个数(C/C++版)(1)方法:双指针法,数组两端设置左指针和右指针。(2)注意:边界问题取值。[,]:左闭右闭,左右两端指针均可以取到对应位置,则为 <=left = mid + 1 、rigth = mid - 1 、mid = (right + left) / 2[,):左闭右开,左可以取到右边取不到,则为<left = mid + 1、right = mid、mid原创 2022-03-17 21:55:20 · 606 阅读 · 0 评论 -
84、【栈与队列】leetcode ——1047. 删除字符串中的所有相邻重复项:栈+双指针解法(C++版本)
然后遍历下一个元素,直至全部遍历完,让各个相邻元素都不重复的存入栈中。再将其弹栈存入到子串中,因为栈为后进先出,因此需要让字符串进行逆置,恢复原始顺序。其实,就相当于是i为pre指针,i+1为cur指针,j为temp指针(用于存入新元素,指向新子串末尾的下一个位置)。此题和溢出链表元素题的区别,在于本题需要对比的不仅仅是对比原始链表中的相邻元素,还需要再与已经存入的元素进行对比。当原始字符串中相邻元素不相同,而且待存入元素与新字符串的末尾元素不相同时,存入该元素。,让下一次覆盖已存入的元素,并剪枝。原创 2023-01-07 19:27:33 · 435 阅读 · 0 评论 -
77、【字符串】leetcode ——151. 反转字符串中的单词(C++版本)
快指针遍历到非空格元素后,慢指针就依次存储。由于每个单词之间有一个空格并且开头和尾部没有空格,因此每次给非开头单词加一个空格,用来分割单词。的方式去处理空格,使用快慢指针,快指针进行遍历,慢指针用来存储。(erase为O(n),erase外还有一个while。原创 2023-01-04 20:57:24 · 452 阅读 · 0 评论 -
76、【字符串】剑指 Offer ——05. 替换空格(C++版本)
双指针,resize()函数学习原创 2023-01-04 16:45:15 · 193 阅读 · 0 评论 -
74、【数组】leetcode——18. 四数之和(C++版本)
四数之和就是在三数之和多加一个数,用前两个数相加,后面两个数继续作为双指针移动判定。(忽略存储答案的空间,额外的排序的空间复杂度为。(1)第一层的i,与三数之和相同,判定条件为。可知上述三种情况下,一定会是。时,没有未被记录元素被去掉,因此判定条件为。,但后续还有一个-1,可让相加后为-3。(1)第一层的i,在三数之和中的条件为。(2)第二层的j,思路同上,判定条件为。后续还有负数,相加后就有可能等于。,此时后续一定无满足相加后等于。(2)第二层的j,要确保第一次。,故另一个判定条件为。原创 2023-01-03 21:29:04 · 351 阅读 · 0 评论 -
73、【数组】leetcode——15. 三数之和(C++/Python版本)
因此我们的目标便是:对于含有重复元素的数,每次仅对比记录一次,若后续再次出现重复元素,则将其跳过。本题的难点在于去重,针对两种不同的方式:双指针和Hash采用不同的去重判定条件。当按次顺序从前往后依次遍历时,不会出现因异位而出现的重复三元组,例如。而可能会出现因数组中本身存在的相同元素导致出现记录重复三元组,例如。(忽略存储答案的空间,额外的排序的空间复杂度为。后,再在该元素的后续集合中的首和尾分别设置指针。,而不是三元组里重复的数。,说明三者相加的数小了,,说明三者相加的数大了,原创 2023-01-03 20:33:02 · 413 阅读 · 0 评论 -
65、【数组】AcWing 800. 数组元素的目标和——滑动窗口(C++版本)
先通过暴力解,可以得到答案输出。因A和B各自具有单调性(单调递增),因此可利用A和B的单调性,分别从A的头部和B的尾部移动,当找到时,移动B的右端指针,往左移。当找到时,输出i和j。注:需要从A和B相反的两端走才行,不能各从A和B的首部开始寻找,若各自从首部开始走,可能会把更小的一个有效数移过。原创 2022-12-30 20:21:04 · 83 阅读 · 0 评论 -
63、【数组】AcWing 799. 最长连续不重复子序列——滑动窗口与Hash(C++版本)
滑动窗口原创 2022-12-29 19:36:45 · 110 阅读 · 0 评论 -
62、【数组】leetcode——54. 螺旋矩阵:N*M型(C++版本)
螺旋矩阵原创 2022-12-29 18:25:52 · 126 阅读 · 0 评论 -
60、【数组】leetcode——904. 水果成篮-滑动窗口:最大窗口(C++版本)
滑动窗口原创 2022-12-29 17:14:54 · 114 阅读 · 0 评论 -
60、【数组】leetcode——209. 长度最小的子数组-滑动窗口:最小窗口(C++、Python版本)
题目描述原题链接:209. 长度最小的子数组题中条件(1)正整数;(2)目标子序列为连续的;(3)目标为连续的子序列中长度最小的;根据这两个特性,主要需要解决两个问题:(1)找出满足条件的连续子序列(2)找出各个子序列中长度最小的那个子序列由此可以将问题转化为上述两个子问题,首先第一步找出满足条件的连续子序列,也就是遍历数组求和,找出满足≥target的序列。找到后,记录该子序列的长度。与其已有长度进行比较,若更小则更新,若没有比其更小,则不记录该序列。以此方式,对下一个子序列进行遍原创 2022-02-16 23:22:17 · 778 阅读 · 0 评论 -
22、【顺序表】-【2018统考真题】寻找数组中的最小正整数(C++版)
题目描述题目分析目标是找到表中的最小正整数,该表既可能为有序表也可能为无序表,并且表中可能具有负数或零。首先,考虑若n未出现最小正整数时,数组中的情况为具有含1~n的数,然后,考虑若n出现最小正整数时,说明不满足上述的条件,即数组中至少存在一个数不在1~n之间。那么,便可以通过构建一个统计表,记录在1~n中是否存在未出现的数,并且在未出现数的中最小的那个数便为此次寻找的最小正整数。解法构建一个数组B,作为统计表使用,将其所有元素初始化为0。在数组A中遍历,每当得到一个正整数,则将该正整数减去原创 2021-01-08 10:32:57 · 682 阅读 · 0 评论 -
7、代码的完整性——调整数组顺序使奇数位在前偶数位在后(python版)
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。1、遍历算法使用一个列表变量存数,先按顺序存奇数,再按顺序存偶数class Solution: def reOrderArray(self, array): # write code her...原创 2020-03-06 13:17:09 · 1000 阅读 · 1 评论 -
6、查找和排序——旋转数组的最小数字(python版)
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。该数组中的重要数字特征为:非递减排序首先,最简单的方式是1、遍历算法class Solution: ...原创 2020-03-05 11:48:50 · 264 阅读 · 1 评论 -
39、【查找】二分查找:数的范围和查找某个数(C/C++版)
算法思想二分查找(折半查找) 是针对有序序列的一种快速查找方式,与高中时候数学中学的二分法有异曲同工之处。通过不断缩小目标值所在区间的范围实现快速查找到目标值。每次将目标值与区间内的中位数进行比较,比中位数小则在中位数的做区间内再查找,如果比中位数大则在中位数的有区间内再查找,以相同的规则作用于缩小后的区间,以此类推最终便可找到结果。本质上二分查找是针对某种序列划分出具有不同性质的两种区间,当mid落在在不同性质区间内,对区间进行相应的变化,从而找到我们需要的目标。不仅仅可针对有单调性的序列,同时对于原创 2021-04-19 16:30:10 · 3296 阅读 · 0 评论 -
24、【数组】旋转矩阵(C++版)
题目描述题目分析目标矩阵的行列数相同,均为n。则此题是n×n型矩阵的旋转,重点把握好旋转前后行、列索引编号的变化。通过对旋转前后的索引编号进行分析找出,旋转后的变化关系即可。解法一:辅助数组当旋转第一行时,(0,0) => (0,3)(0,1) => (1,3)(0,2) => (2,3)(0,3) => (3,3)当旋转第二行时,(1,0) => (0,2)(1,1) => (1,2)(1,2) => (2,2)(1,3) =>原创 2021-01-10 13:01:54 · 8335 阅读 · 3 评论 -
23、【数组】对角线遍历(C++版)
题目描述题目分析对一个3×3型数组的对角线遍历,重点在于对于数组索引的分析,首先来看一下上述图中,遍历索引的顺序0,0 // 第一趟0,1 1,0 // 第二趟2,0 1,1 0,2 // 第三趟1,2 2,1 // 第四趟2,2 // 第五趟设行索引值为x,列索引值为y,趟数值为z。首先,从趟数和行列索引值的关系上,可发现在对角线遍历时,x + y = z - 1恒成立。因此,便可将此公式作为我们的遍历过程的便界条件。然后,再从每一趟的情况来看,原创 2021-01-10 12:24:58 · 933 阅读 · 0 评论 -
3、数组——二维数组中的查找(python版)
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。重要信息:二维数组,每行从左到右依次递增,每列从上到下依次递增。假设:1 2 3 43 4 5 64 6 8 199 11 13 15最简单的方法1、...原创 2020-03-04 10:09:53 · 7000 阅读 · 1 评论 -
61、【数组】leetcode——[高频考题]59. 螺旋矩阵 II:N*N型(C++、Python版本)
1. 题目描述运行效果图示举例2. 方法一:以起点、长度为研究对象,迭代更新观察矩阵特点,填充顺序是从左至右、从上至下、从右至左、从下至上,然后再次在新的起点进行相同顺序填充。可发现每次新填充的起点沿着矩阵的主对角线。在这一个过程中有三个重要的地方:填充起点、填充顺序和填充长度。由此,构建仿真模拟这一过程。填充起点设置对角线,每填充新的一层就往对角线下移动一个位置。填充顺序按照右、下、左、上顺序进行。填充长度设置一个偏移量,来控制每层填充的长度。以左闭右开([,))的填充方式进行原创 2022-02-19 18:58:37 · 737 阅读 · 0 评论