前端开发包括哪些内容,攀枝花网站怎么做seo,wordpress 站点维护,中信建设有限责任公司 乔锋 电话今天是第一天#xff0c;GUNDOM带你学算法#xff0c;跟上我的节奏吗#xff0c;一起闪击蓝桥杯#xff01;
正文展开#xff0c;今天先上点小菜供大家想用#xff0c;如有错误或者建议直接放评论区#xff0c;我会一个一个仔细查看的哦。 双方指针问题一般是在数组中… 今天是第一天GUNDOM带你学算法跟上我的节奏吗一起闪击蓝桥杯
正文展开今天先上点小菜供大家想用如有错误或者建议直接放评论区我会一个一个仔细查看的哦。 双方指针问题一般是在数组中定义两个指针变量通过对这两个指针变量进行操作来达到解决问题的目的。 用一道最显而易见的题目来解释。 移动0 将所有的0都移动到数组的最后我们可以遍历查找不是0的元素然后将他们从下标位置为i0位置依次放在数组中因为可能有0元素的存在所以在循环之后非零元素的值不会补齐数组中的所有元素就像上边那个例子一样我们要将nums.size()-i的部分置为0这道题就算是结束了。 C代码如下
void moveZeroes(vectorint nums) {//解法1int k0;for(auto i:nums){if(i!0){nums[k]i;k;}i;}coutkendl;for(int jk;jnums.size();j){nums[j]0;}//写法二int pre,tail;for(pre0,tail0;tailnums.size();tail){if(nums[tail]!0){swap(nums[pre],nums[tail]);}}}复写零 如果数组中有零元素就将该0复写后边的元素顺序不变可以知道如果有0元素就一定会有元素越界被丢弃。 这道题目思路很容易想到但是还是有一点坑点。 思路如下 首先要找到最终复写的位置然后从这个位置依次向前复写 在找到要求数组的最后一位后根据值向前遍历。 假设找到的位置为head根据head位置的值来确定数组从后往前写什么初始写入的位置一定是arr.size()-1。如果tail位置是0就可以往前确定两个位置都是零如果不是零就在当前tail位置写入head位置的值然后更新head和tail的数值。 代码如下
void duplicateZeros(vectorint arr) {int head 0;int tail 0;while (tail arr.size()){if (arr[head] 0){tail ;}tail;head;}head--;cout head endl;tail arr.size() - 1;while (tail0){if (arr[head] 0){arr[tail--] 0;arr[tail--] 0;}else{arr[tail--] arr[head];}head--;}for (auto i : arr){cout i;}
}动图演示如下 但是写完后提交…… 推演一遍我们就会发现head落在了不对的地方所以才会造成一连串错误。 如果tail位置大于size,那就直接将数组末尾元素置0将tail和head向前移动重新锁定位置。
if (tail arr.size()){arr[arr.size() - 1] 0;tail arr.size()-2;headhead-1;}else{tail arr.size() - 1;}顺利过关。 盛水最多的容器 以x轴为桶宽以y轴为木桶高度我们知道水桶效应判断木桶能装多少水是取决于短板的。 分析题目如果用暴力求解的方法依次算出不同变量下木桶能盛多少水然后就可以知道最大的装水量。 使用双指针算法可以遍历更少的次数求解出答案。 包含第一个轴的最大盛水量就求出来了保存该值以第二个轴和第一个轴为木桶边界以下称head,tail此时两轴中低的是7移动前边的轴宽度会减小且高度最大还是7所以又求出一个最大值49。 移动后边的轴即tail以倒数第二个轴即3的高度继续以同样的形式继续求最大值可以得到18移动前边的轴即head继续判断。 可以看出这种方式只遍历一遍就可以找到最大的面积。 代码如下
class Solution {
public:
int maxnum(int a,int b)
{return ab?a:b;
}
int minnum(int a,int b)
{return ab?a:b;
}int maxArea(vectorint height) {int left0;int rightheight.size()-1;int widthright;int mul0;int ret0;while(left!right){int lengthminnum(height[left],height[right]);retlength*width;if(retmul){mulret;}if(height[left]height[right]){left;}else{right--;}width--;}return mul;}
};总结 双指针的题目只需要有清晰的思路要清楚指针的位置把握好结束条件双指针的思路上边的题目玩的很简单最后一道题要善于观察分析就可以写出更加高效的方法。