[算法练习]Day 5:定长滑动窗口+变长滑动窗口
3694. 删除子字符串后不同的终点
这个做了好久,思路是会的但是对c++的stl还是不是特别熟练。列举一下通过这个题学到的内容:
- 对于set容器,其模板参数只能有一个类型,不能set<int,int>s;
- 有的容器支持pair类型的哈希处理有些不支持,一般来说unordered的容器是不支持的
class Solution {
public:int distinctPoints(string s, int k) {int ans = 0;int x = 0;int y = 0;for(char c: s){switch(c){case 'U': y++;break;case 'D': y--;break;case 'L': x--;break;case 'R': x++;break;}}int len = s.size();// 只需要计数就好了呀!!笨死了我// 用set不就好了// 但是set的模板只能使用一个类型,真没招了// 可以用两个int进行拼接为longlong类型set<pair<int,int>>st;for(int right = 0;right < len;right++){switch(s[right]){case 'U': y--;break;case 'D': y++;break;case 'L': x++;break;case 'R': x--;break;}int left = right - k + 1;if(left < 0) continue;st.insert({x,y});switch(s[left]){case 'U': y++;break;case 'D': y--;break;case 'L': x--;break;case 'R': x++;break;}}ans = st.size();return ans;}
};
3. 无重复字符的最长子串
注意双指针的思想,主要就是要找准移动指针的时机。我写的代码有点冗余
class Solution {
public:int lengthOfLongestSubstring(string s) {int ans = 0;unordered_set<char>st;for(int r = 0,l = 0;r < s.size();r++){int temp = st.size();st.insert(s[r]);if(st.size() == temp){while(l <= r){if(s[l] == s[r]){l++;break;}else{st.erase(s[l]);l++;}}}else{ans = max((int)st.size(),ans);}}return ans;}
};
3090. 每个字符最多出现两次的最长子字符串
这么写更为简洁,直接移动左指针并根据最多出现的字符为依据进行判断。
class Solution {
public:int maximumLengthSubstring(string s) {int ans = 0;unordered_map<char,int>umap;for(int l = 0,r = 0;r < s.size();r++){char c = s[r];umap[c]++;while(umap[c] > 2){umap[s[l]]--;l++;}ans = max(ans,r-l+1);}return ans;}
};
1493. 删掉一个元素以后全为 1 的最长子数组
这个题我的思路就是:首先一定要保证区间的一致性,要么半开半闭要么全闭区间,我这里选择的全闭区间,即区间中只能有一个0!其次使用zero保存0是否存在,感觉写的不是特别简洁。
class Solution {
public:int longestSubarray(vector<int>& nums) {int ans = 0;int zero = 1;int temp = 0;for(int left = 0,right = 0;right < nums.size();right++){if(nums[right] == 1){temp++;ans = max(ans,temp-zero);continue;}if(nums[right] == 0){if(zero == 1){zero--;ans = max(ans,temp-zero);continue;}else{while(nums[left] != 0){left++;temp--;}left++;}}}return ans;}
};
但是灵神的思路是使用变量来维护区间中0的个数,确实更加的简洁,学习一下
class Solution {
public:int longestSubarray(vector<int>& nums) {int ans = 0;int cnt = 0;for(int left = 0,right = 0;right < nums.size();right++){cnt += 1 - nums[right];while(cnt > 1){cnt -= 1 - nums[left];left++;}ans = max(ans,right-left);}return ans;}
};