数组
常见的数组面试题
Lc_summer
这个作者很懒,什么都没留下…
展开
-
二分法寻找旋转数组中的target
在旋转数组中找target题目描述给出一个转动过的有序数组,你事先不知道该数组转动了多少(例如,0 1 2 4 5 6 7可能变为4 5 6 7 0 1 2).在数组中搜索给出的目标值,如果能在数组中找到,返回它的索引,否则返回-1。假设数组中不存在重复项。思路数组有序首选二分,但是题目中数组并非完全有序,而是因为旋转的原因导致数组被分割成了两个有序数组,当我们二分查找的时候,总能找到一边的数组时有序的,那么此时我们就根据这个个有序的数组来判断是否target在其中,如果不在那么target然原创 2021-03-05 09:35:30 · 465 阅读 · 2 评论 -
双指针求数组中和等于target的四个数
四数之和给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。示例:给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。满足要求的四元组集合为:[[-1, 0, 0, 1],[-2, -1, 1, 2],[-2, 0, 0, 2]]思路原创 2021-02-26 16:37:23 · 208 阅读 · 0 评论 -
利用哈希数组求解string1的所有字符是否都存在string2
赎金信给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)注意:你可以假设两个字符串均只含有小写字母。canConstruct(“a”, “b”) -> falsecanConstruct原创 2021-02-26 16:36:02 · 93 阅读 · 0 评论 -
利用无序映射表(unordered_map)求四数和为0出现的次数
四数相加给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。例如:输入:A = [ 1, 2]B = [-2,-1]C = [-1, 2]D = [ 0, 2]输出:2解释:两个元组如原创 2021-02-26 16:35:30 · 194 阅读 · 0 评论 -
双指针求数组中和为0的三个数
三数之和给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]思路先排序,再用双指针,首先遍历数组,双指针指向当前元素后的首尾位置,判断双指针指向的值之和是否==target - 当前的最小值 vector<vector<原创 2021-02-26 16:34:28 · 152 阅读 · 0 评论 -
利用无序映射(unordered_map)求数组中等于target的两个数的下标
两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]示例 2:输入:nums = [3,2,4], target = 6输出:[1,2]示例 3:输入:nums = [3,3], target = 6输出:[0,原创 2021-02-26 16:33:55 · 209 阅读 · 0 评论 -
利用无序集合(unordered_set)求数组的交集
两个数组的交集给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]思路先将nums1元素复制到无序集合numsSet1中,然后遍历nums2的元素将存在于numsSet1中的数插入到无序集合resultSet中,最后将resultSet中的元素复制到vector中;vector<int> i原创 2021-02-26 16:32:11 · 1174 阅读 · 0 评论 -
采用哈希数组判断两个字符串是否异构
有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例 1:输入: s = “anagram”, t = “nagaram”输出: true示例 2:输入: s = “rat”, t = “car”输出: false说明:你可以假设字符串只包含小写字母。思路采用哈希表,哈希表用数组构建,下表为字符与‘a’的相对大小,数组值为字符出现的次数,先遍历s,记录每个字符出现的次数,然后再遍历t,减去t中出现的字符数,最后判断数组中的所有值是否都为0原创 2021-02-26 12:39:49 · 144 阅读 · 0 评论 -
将1到n*n顺时针赋值到n*n的矩阵中
螺旋矩阵给定一个正整数 n,生成一个包含 1 到 n*n 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。示例:输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]思路:模拟顺时针画矩阵的过程,1.从左到右;2.从上到下;3.从右往左;4.从下往上,每次都在前闭后开区间[a,b),从(0,0)开始每一圈都以矩阵的左上角为起点画圆,一圈结束后,起点的x,y加1继续画圆,如果n为偶数,则需要画n/2个圆;如果n为奇数,则画n/2个原后,将矩阵中心的值(原创 2021-02-25 18:33:43 · 840 阅读 · 0 评论 -
滑动窗口求解长度最小子数组
长度最小的子数组给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0思路:采用滑动窗口的思想,起始位置窗口的大小为1,窗口的起点和终点都在nums的首地址,保持窗口的起点不动,终点不断向右滑动,直到窗口内的数据和sum>=target,然后保持窗口的终点不动,窗口的起点不断向右滑动,直到sum<原创 2021-02-25 18:04:39 · 173 阅读 · 0 评论 -
移除数组中的元素
移除元素给你一个数组 nums和一个值val,你需要原地移除所有数值等于val元素,并返回移除后数组的新长度,不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。思路:采用双指针,一个指针用来遍历原来的数组的所有元素,另一个指向不包含val的数组的元素,在遍历原数组的过程中,只需要将不是val的值复制到nums数组的前面int removeElement(vector<int>& nums,int原创 2021-02-25 17:44:47 · 413 阅读 · 0 评论 -
在有序数组中搜索target的插入位置
搜索插入位置给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。int searchInsert(vector<int>& nums,int target){ int left = 0; int right = nums.size()-1; if(target<nums[left]) //target在数组第一个位置 return 0; if(target>n原创 2021-02-25 17:27:28 · 340 阅读 · 0 评论