写到两个给我感觉很类似的双指针题目,但是代码不同,我想把两个题放在一起,对比着看看。
第一题:
首先,提到“重复”,比较好想到哈希表。访问过就在哈希表里记录,然后只要找哈希表中有没有这个数就知道他有没有出现过了。但我一开始只是想记录“是否存在”,其实答案是记录“这个数存在的最大位置”,也就是利用他来求最大距离。
我们可以想象,有一个指针一定会从头往后遍历字符串,那么怎么判断他之前有多少个最大无重复字符呢?我们可能会想还要一个指针,这就是本题的一个思维难点:什么时候移动指针?移动到哪个位置?
如果s[j]这个数已经有过,那么修改i指针,使i后移到数字中s[j]的前一个位置,防止重复。(这里很难想到......我也不知道怎么解释比较好qvq)
哦,这一题还能用动态规划+哈希表,但我还不会。留个凳子在这之后写(哈哈哈哈给自己留尾巴)
代码:
class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_map<char,int>m;int res=0;int i=-1;for(int j=0;j<s.size();j++){if(m.find(s[j])!=m.end()){i=max(i,m.find(s[j])->second);//就是<char,int>对应的int,数s[j]的位置}m[s[j]]=j;//哈希表记录的是数s[j]的位置res=max(res,j-i);}return res;}
};
第二题:
我想应该找两个距离最远,他们中高度小的height值最大的两个位置。
那么为了距离最远,我们直接让两个指针指向0, n-1,一头一尾。只要遍历是让area最大就可以。难点同样在于:什么时候移动指针?移动哪一个指针?
题解给出的是移动两个height值最小的那一个位置,如果是左边的指针右移,如果是右边的指针左移。可以证明如果要使area>原值,那么一定是移动height值最小的那个位置,不然怎么移都只会变小或不变。
代码:
class Solution {
public:int maxArea(vector<int>& height) {int l=0,r=height.size()-1;int n=height.size();int ans=0;while(l<r){ans=max(ans,min(height[l],height[r])*(r-l));if(height[l]<height[r])l++;elser--;}return ans;}
};
OK写到这里自己有一些感觉了,双指针题目一般的难点就是怎么移动指针。希望在做题的时候能想明白这个,代码应该不难写。
加油!