![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
类型总结之——数组篇
数组
Mona______
好好学习天天向上 o(≧v≦)o
展开
-
数组总结点睛
数组专题1、要注意vector、array、数组三者的区别:vector的底层实现是array,严格来讲,vector是容器,不是数组。共同点:* 1、都可以用下标操作进行处理* 2、都可以用迭代器进行操作* 3、三者的存储都是连续的,可以进行随机访问* 4、都是对同一种类型的数据进行储存。不同点:* 1、数组是不安全的,array和vector是比较安全的(因为可以有效地避免越界等问题)* 2、array对象和数组存储在相同的内存区域(栈)中,vector对象存储在自由存储区(堆)原创 2021-04-19 20:33:36 · 113 阅读 · 0 评论 -
leetcode——第315题——树状数组&归并排序 逆序对
题目:计算右侧小于当前元素的个数给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。/*使用前缀和的解法,但是需要对原始的数据做一些处理1、反转后的数组,nums 倒叙反转所得,因为倒叙输入才能转换为前置的 前缀和数组2、排序后的数组,排序时重复元素归类为同一个,所以排序后的总元素个数是小于等于原始的数组元素个数的3、频率数组,依次遍历反转后的数组,按照排序数组记录的原创 2021-06-03 18:03:42 · 215 阅读 · 0 评论 -
leetcode——第307题——树状数组 区域和检索
给你一个数组 nums ,请你完成两类查询,其中一类查询要求更新数组下标对应的值,另一类查询要求返回数组中某个范围内元素的总和。实现 NumArray 类:NumArray(int[] nums) 用整数数组 nums 初始化对象void update(int index, int val) 将 nums[index] 的值更新为 valint sumRange(int left, int right) 返回子数组 nums[left, right] 的总和(即,nums[left] + nums[原创 2021-06-03 17:50:58 · 278 阅读 · 2 评论 -
leetcode——第448题——找到所有数组中消失的数字
题目:给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。class Solution {public: vector<int> findDisappearedNumbers(vector<int>& nums) { // 方法一:负数标记 // 第一次写的时候写错了,没加 abs,这肯定错呀,因原创 2021-06-02 19:23:47 · 423 阅读 · 0 评论 -
leetcode——第523题——连续的子数组和
题目:给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:子数组大小 至少为 2 ,且子数组元素总和为 k 的倍数。如果存在,返回 true ;否则,返回 false 。如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。class Solution {/*1、前缀和2、unordered_map count 函数,返回对应 key 值的元素个数,因为 哈希表中的元素个数唯一,所以如果原创 2021-06-02 18:55:42 · 169 阅读 · 0 评论 -
leetcode——第493题——翻转对
题目:给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。你需要返回给定数组中的重要翻转对的数量。// 归并排序 = 分治 + 归并// 分治常用 partition 或者是 split/*本题就是用常规的归并排序的套路来完成的只不过需要再归并之前,对 左右两个部分的数组计算一下逆序对儿1、分治,就是把数组分组,每次分成两部分,前面和后面,以 [1,3,2,3,1] 为例 注意分治的思想,原创 2021-06-02 17:08:37 · 219 阅读 · 0 评论 -
leetcode——第162题——寻找峰值
题目:峰值元素是指其值大于左右相邻值的元素。给你一个输入数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] = nums[n] = -∞ 。class Solution {/*这两种方法都是使用了二分法的 左闭右开 [left, right)nums[i] > nums[i + 1],主要的精髓就在这句话,为了找到峰值,就需要考虑是处于局部升序还是局部降序当满足这个说明处于 局部降序,那么就需要原创 2021-05-29 15:43:43 · 84 阅读 · 0 评论 -
leetcode——第904题——水果成篮
题目:在一排树中,第 i 棵树产生 tree[i] 型的水果。你可以从你选择的任何树开始,然后重复执行以下步骤:把这棵树上的水果放进你的篮子里。如果你做不到,就停下来。移动到当前树右侧的下一棵树。如果右边没有树,就停下来。请注意,在选择一颗树后,你没有任何选择:你必须执行步骤 1,然后执行步骤 2,然后返回步骤 1,然后执行步骤 2,依此类推,直至停止。你有两个篮子,每个篮子可以携带任何数量的水果,但你希望每个篮子只携带一种类型的水果。用这个程序你能收集的水果树的最大总量是多少?class原创 2021-05-28 00:13:08 · 290 阅读 · 0 评论 -
第三题——二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。...原创 2021-04-15 22:26:15 · 87 阅读 · 0 评论 -
leetcode——第977题——有序数组的平方
题目:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。class Solution {/*1、vector还是数组呀,直接 insert的话,时间复杂度太低,2、if(nums[slow] * nums[slow] > nums[fast] * nums[fast]) 这句倒是可以直接判断出来最终的顺序,但是输出的数组怎么变成平方,就搞了半天3、还需要重新定一个数组,作为输出来用4、感觉很巧妙的,好好细品一下原创 2021-05-26 21:52:47 · 130 阅读 · 0 评论 -
leetcode——第844题——比较含退格的字符串
题目:给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。class Solution {/*使用了一个辅助函数来进行判断辅助函数中用的双指针典型思路,然后在主函数中进行最后的判断。*/public: bool backspaceCompare(string s, string t) { int len1 = isLegal(s);原创 2021-05-26 21:03:36 · 101 阅读 · 0 评论 -
leetcode——第283题——移动零
题目:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。class Solution {public: void moveZeroes(vector<int>& nums) { int slow = 0; for(int fast = 0; fast < nums.size(); ++fast) { // 1、注意是 用fast下标 对应的元素来进行比较原创 2021-05-26 19:42:56 · 84 阅读 · 0 评论 -
leetcode——第26题——删除数组中的重复项
题目:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。class Solution {/*如果相等,fast 后移 1 位如果不相等,将 fast 位置的元素复制到 slow+1 的位置上,slow 和 fast 都 后移一位优化小技巧:此时数组中没有重复元素,按照上面的方法,每次比较时 nums[p] 都不等于 nums[q],原创 2021-05-26 19:14:58 · 217 阅读 · 0 评论 -
剑指offer——第53-2——缺失的数字
题目:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。class Solution {/*这道题是把数组分成了两类,一类的 nums[i] == i,一类是 nums[i] != i一定是左边相等,右边不相等的情况,因此,就按照这个思路,取right边界 即可也就是找到 第一个 nums[i] != i 对应的下标 right 就是正好缺失的数字*/ public:原创 2021-05-25 23:19:06 · 113 阅读 · 0 评论 -
剑指offer——第53-1题——在排序数组中查找数字
题目:统计一个数字在排序数组中出现的次数。class Solution {/*方法一算是我第二次写,错误的地方就是在while循环里没写 return count导致一直循环出不来,当在 mid == target 之后,满足条件要及时返回啊这个是方法二的主要思想容易想到的方式就是分别用二分查找的方式去查找 target 在数组的左边界和右边界,然后将右边界减左边界即可得到结果分别查找 target 左边界和右边界的逻辑会有差异,这里可以取巧,变成分别查找 target-1 的右边界和原创 2021-05-25 22:33:40 · 78 阅读 · 0 评论 -
剑指offer——第11题——旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。class Solution {/*1、比较的是 numbers[middle] 与 numbers[right],这样便于进行分类和操作2、旋转数组实际上可以划分为两个排序的子数组3、为什么是 right-- 缩小范围,而不是 left++ 因为数组是升序的,所原创 2021-05-25 21:49:41 · 104 阅读 · 0 评论 -
leetcode——第367题——有效地完全平方数
题目:给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。进阶:不要 使用任何内置的库函数,如 sqrt 。class Solution {public: // 二分法的第一种写法 bool isPerfectSquare(int num) { // // // 不对不对不对 不对的解法 // // int res = exp(0.5 * log(num)); //原创 2021-05-25 20:48:25 · 93 阅读 · 0 评论 -
leetcode——第69题——求平方根
题目:实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。class Solution {public: int mySqrt(int x) { // // 二分法,首先要有 左区间端点,右区间端点,中间点 // // 左闭右闭 // if(x == 0) return x; // int left = 1;原创 2021-05-10 16:21:49 · 538 阅读 · 0 评论 -
leetcode——第34题——在排序数组中查找元素的第一个和最后一个位置
题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?class Solution {public:// 法一::展开来写 vector<int> searchRange(vector<int>& nums, int target) {原创 2021-05-10 19:28:35 · 88 阅读 · 0 评论 -
leetcode——第704题——二分查找
题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。class Solution {public: // int search(vector<int>& nums, int target) // { // // 区间定为 [left, right] // int left = 0, right = nums.原创 2021-05-25 16:04:13 · 140 阅读 · 0 评论 -
leetcode——第59题——螺旋矩阵
题目:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。class Solution {public: vector<vector<int>> generateMatrix(int n) { // 要特别注意length的设定,初始化为1,在循环中通过j<starty+n-length语句来控制 // 因此一次循环后length+=2;原创 2021-04-19 14:43:51 · 146 阅读 · 0 评论 -
leetcode——第209题——滑动窗口
题目:给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例 1:输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。class Solution {public: int minSubArrayLen原创 2021-04-19 12:50:02 · 138 阅读 · 0 评论 -
leetcode——第27题——双指针法
题目:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素.示例 1:输入:nums = [3,2,2,3], val = 3输出:2, nums = [2,2]解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长原创 2021-04-18 23:18:14 · 211 阅读 · 0 评论 -
leetcode——第35题——二分查找法
题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0输出: 0class Solution {public: int searchInsert(vector<原创 2021-04-18 20:06:35 · 139 阅读 · 0 评论