![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
英雄哥算法入门指引
weixin_43288822
这个作者很懒,什么都没留下…
展开
-
数据结构-线性表(数组)-双指针-不定长滑动窗口567&713&3&697
目录什么时候使用不定长滑动窗口(尺取法)?尺取法做法跟前缀和法的区别?leetcode题713. 乘积小于 K 的子数组什么时候使用不定长滑动窗口(尺取法)?寻找一个容器中是否有(有多少个)子容器符合某种条件,根据上述,这个条件大概率是指小于某某指,可以使用尺取法。尺取法做法尺取法做法: 现在遇到的尺取法就是固定右边界,这时该窗口刚好符合不超过条件,当右边界往右再移动一下就会不符合条件。这时就需要右移左边界。左右指针都只会增加不会减小。跟前缀和法的区别?什么时候尺取法?什么时候前缀和法?那种场景原创 2022-05-27 11:37:49 · 197 阅读 · 0 评论 -
数据结构-线性表(数组)-双指针-定长滑动窗口567
定长窗口方法:固定窗口长度不变,使用该窗口在序列中滑动,判断当前窗口中的元素跟目标是否匹配567.字符串的排列方法固定窗口,由于排列不会改变字符串中每个字符的个数,所以只有当两个字符串每个字符的个数均相等时,一个字符串才是另一个字符串的排列。所以可以通过对应元素个数是否相等来判断是否匹配。数组cnt1表示s1中每个字符出现的次数,数组cnt2表示s2窗口中每个元素出现的次数。判断两个数组是否相等就可以。对上面优化,因为每次滑动窗口,只统计了一进一出两个字符,但是要比较整个数组,浪费资源。只原创 2022-05-19 10:08:23 · 131 阅读 · 0 评论 -
数据结构-线性表(数组)-双指针-快慢指针 Offer22&19&141+142floyd判环法
剑指 Offer 22. 链表中倒数第k个节点原创 2022-05-14 11:48:23 · 211 阅读 · 0 评论 -
数据结构-线性表(数组)-双指针->数组逼近(左右指针)167 & 15* & 18 &11*
两数之和 II - 输入有序数组思路我的思路:从数组两端逼近target,左右指针指向元素和大于target,则右指针左移;反之,左值针右移。其他:确定一个元素,找target-nums[i],有序数组,二分查找。代码我的做法:class Solution {public: vector<int> twoSum(vector<int>& numbers, int target) { int len = numbers.size().原创 2022-05-06 11:20:24 · 307 阅读 · 0 评论 -
数据结构-线性表(数组)-双指针->数组追赶(快慢指针) 977&344&151&524&611无&80&986(没做)(总结各种排序算法 原地算法图解)
这类题为什么叫数组追赶?有序数组的平方思路法一:先对nums每个元素进行平方,再sort排序法二:找到nums中负数和正数的分界线,进行类似与归并排序进行排序。[0,divid]为负数,平方后递减;[divid+1,len-1]为正数,平方后递增。相当于有了两个有序数组,用两个指针分别指向前一个数组最后面元素和后一个数组最前面的元素,均为两个数组中最小的元素,依次比较,选较小的放入新数组中,并且移动指针,当某个指针移出边界后,令一个指针还没遍历到的依次放入新数组就可。法三:左右指针,nums原创 2022-04-24 16:40:16 · 1306 阅读 · 0 评论 -
数据结构-线性表(数组)-线性前缀和+二分查找 528. 按权重随机选择 非常重要
思路构造前缀和数组,在0~sum中生成一个随机数,找第一个严格大于随机生成数x的数,这个数对应的下标就是要找的下标。前缀和数组presum,presum[i]与前一位置的前缀和presum[i-1]相减正好的下标i对应的数,也就是下标i的权值,就相当于以长度代表概率,对于任意一个x,他严格小于最小前缀和presum[i],表示他在[presum[i-1],presum[i]]区间内,区间长度:presum[i]-presum[i-1] = w[i],随机数一共有sum种情况,在以上区间的情况为w[i].原创 2022-04-22 11:26:32 · 363 阅读 · 0 评论 -
数据结构-线性表(数组)-线性前缀和+哈希表 930 && 974 && 525
930和相同的二元子数组 同560题思路求连续子数组,一般考虑前缀和。需要查找再想到哈希表。sum[i]表示数组nums中0~i的前缀和,假设子数组[j,i+1]和为gal,也就是sum[j]-sum[i] = gal;子数组长度为j-i;所以遍历nums,查看当前值前缀和在哈希表中存在的个数x,就说明当前值为结尾的子数组和为gal的子数组个数为x个代码解析class Solution {public: int numSubarraysWithSum(vector<.原创 2022-04-21 11:19:57 · 470 阅读 · 0 评论 -
数据结构-线性表(数组)-前缀和变形-前缀积 238. 除自身以外数组的乘积&&剑指 Offer 66. 构建乘积数组
解题思路与前缀和数组和后缀和数组类似,构建前缀积数组和后缀积数组利用O(1)的空间复杂度,构建后缀积数组,利用前缀积值利用前缀积值和后缀积值同时进行 代码q前缀积数组和后缀积数组class Solution {public: vector<int> productExceptSelf(vector<int>& nums) { int len = nums.size(); vector<int> .原创 2022-04-15 10:29:12 · 1005 阅读 · 0 评论 -
数据结构-线性表(数组)-前缀和统计排序 523. 连续的子数组和 哈希 除法转换成求余
解题思路暴力解法:先生成一个前缀和数组,再从字串长度为L = 2开始到L = len 对数据数组进行遍历。会超时。O(n^2)利用前缀和值+哈希表。其中有一个同余定理,既当a%x == b%x 时,b-a(假设b>a)为x的整数倍。可以遍历数组,每次计算当前前缀和的值sum,sum%x在哈希表中时,需要再进行判断当前位置与哈希表中相等的那个之间的距离是否大于等于2如果sum%x不在哈希表中时,把sum%x存入哈希表中哈希表初始化时要存入(0,-1),下标比长度小1,当元素前.原创 2022-04-15 09:59:33 · 125 阅读 · 0 评论 -
数据结构-线性表(数组)-前缀和入门 724. 寻找数组的中心下标 && 1588. 所有奇数长度子数组的和 &&303. 区域和检索 - 数组不可变
724. 寻找数组的中心下标解题思路枚举数组中每个元素,计算左边和右边是否相等,相等则返回下标。代码int pivotIndex(vector<int>& nums) { int len = nums.size(); //1 int sum[len]; for(int i = 0;i<len;++i){ sum[i] = nums[i]; if(i){原创 2022-04-08 09:43:42 · 1286 阅读 · 0 评论 -
数据结构-线性表(数组)-原地算法 27.移除元素--左右指针细节处很重要
法一:双指针法(快慢指针):从头出发,在原位刷新一个新数组,慢指针代表新的数组的尾部,快指针遍历原数组。对不等于val的值,从原数组中添加到新数组的尾部。class Solution {public: int removeElement(vector<int>& nums, int val) { int len = nums.size(); int j = 0; for(int i = 0;i<len;i++)原创 2022-03-09 21:27:37 · 64 阅读 · 0 评论 -
数据结构-线性表(数组)-原地算法 217.存在重复元素&&2154.将找到的值乘以2(排序 哈希表)
解题思路法一:先将数组排序,再利用候选数组(跟26. 删除有序数组中的重复项一样),如果候选数组最后的索引与原数组长度-1相等,则没有相同的元素查找可以利用哈希表,如果当前元素没有在哈希表中,则把当前元素添加进去,如果在,则直接返回false。代码法一:class Solution {public: bool containsDuplicate(vector<int>& nums) { int len = nums.size(); ..原创 2022-04-02 10:43:54 · 439 阅读 · 0 评论 -
数据结构-线性表(数组)-原地算法 26. 删除有序数组中的重复项
思路数组是升序,所以相等的元素一定出现在连续的一段区间内。核心是对比,相等就存到候选数组中,不相等就舍弃。最后得到的是候选数组。代码class Solution {public: int removeDuplicates(vector<int>& nums) { int j = 0; int len = nums.size(); for(int i = 1; i<len; ++i){ i..原创 2022-03-31 20:30:33 · 637 阅读 · 0 评论 -
数据结构-线性表(数组)-使用线性枚举求数组中最值 2170.使数组变成交替数组的最少操作数(非常重要的题-hash)
思路:1.每个数都可以经过一次修改(注意:不是加一或者减一),所以每个数最多只需要修改一次。2.所有下标为奇数的数需要改成一样的;所有下标为偶数的数也需要改成一样的。3.所以,我们只需要统计所有下标为奇数的数里面频率最高的找出来,然后把其它数改成和它一样;下标为偶数的也同样处理。4.最后统计两者之和。5.统计一堆数里面频率最高的数,可以用哈希表实现。6.但是,相邻的数又不能相等,所以当找出来的奇数和偶数下标对应的频率出现最高的数是相等的情况,我们需要让 奇数下标 的数选择次大的数,或者让偶数..原创 2022-03-30 11:11:24 · 659 阅读 · 0 评论 -
数据结构-线性表(数组)-线性枚举中最值算法 1464.数组中两元素的最大乘积 && 628.三个数的最大乘积
数据结构:数组算法:线性枚举目标:求最大值原始算法思路就是求解数组nums中最大值和次大值class Solution {public: int maxProduct(vector<int>& nums) { int len = nums.size(); int max = (nums[0]-1)*(nums[1]-1); int temp; for(int i = 0;i < len;原创 2022-03-26 10:46:26 · 1124 阅读 · 0 评论 -
数据结构-线性表(数组)-使用线性枚举求数组中最值 414. 第三大的数
线性枚举:通过线性枚举求第几大值就需要定义相同个变量,但是当找n/2个最大值时,时间复杂度会变为O(n^2),这时候需要别的方法代码块中注释的是很重要的技巧。class Solution {public: int thirdMax(vector<int>& nums) { int len = nums.size(); long max = -2147483649; long secondMax = -2147483649.原创 2022-03-29 09:56:17 · 1062 阅读 · 0 评论 -
数据结构-线性表(数组)-线性枚举中最值算法 154.寻找旋转排序数组中的最小值Ⅱ
大部分跟153一样,而且深刻懂了为什么这样了:if(nums[mid] < nums[right]) right = mid;在这种情况下,最优值左边都>=nums[right],最优值右边都<=nums[right]。当nums[mid]==nums[right]时不能确定最优值在mid左半边还是右半边!当不确定最优值在mid左半边还是右半边的时候只需要收缩区间就可!!!因为mid是靠近left,所以收缩right!!!class Solution {public:原创 2022-03-28 10:00:27 · 1096 阅读 · 0 评论 -
数据结构-线性表(数组)-线性枚举中最值算法 153.寻找旋转排序数组中的最小值 -非常重要的题(二分法)
二分法的时间复杂度是O(logn)1. 法一:遍历全部数组找到最小值 O(n);2. 法二:对数组进行排序,最小值就是nums[0];3. 法二:二分查找法 :对于有序数组 类似单峰函数的数组class Solution {public: int findMin(vector<int>& nums) { int left = 0,right = nums.size()-1; while(left<right){//保证左闭右开区间里原创 2022-03-27 16:55:14 · 823 阅读 · 0 评论