日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

滑动窗口解题技巧

發布時間:2024/10/14 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 滑动窗口解题技巧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.和為s的連續正數序列

class Solution { public:vector<vector<int>> findContinuousSequence(int target) {int left = 1;int right = 1;int sum = 0;vector<vector<int>> res;while (left <= target / 2 + 1){if (sum < target){sum+=right;right++;}else if (sum > target) {sum-=left;left++;}else {vector<int> vec;for(int k = left; k <right; k++){vec.push_back(k); }res.push_back(vec);sum-=left;left++;}}return res;} };

2.LeetCode239.滑動窗口的最大值

本題我們維護一個雙端隊列,每次對要進來的元素進行判斷,確保雙端隊列從隊頭到隊尾是從大到小,隊頭存放當前窗口的最大值,為了確保是當前窗口最大值,就需要對隊頭進行判斷。deq.front() == nums[i-k]就是檢查是不是當前窗口。

class Solution { public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> res;deque<int> deq;int len = nums.size();for(int i = 0; i < len; i++){while (!deq.empty() && deq.back() < nums[i]) deq.pop_back();if (!deq.empty() && i >= k && deq.front() == nums[i-k]) deq.pop_front();deq.push_back(nums[i]);if (i >= k-1) res.push_back(deq.front());}return res;} };

2.LeetCode3.最長不含重復字符的字符串


C++(自己思路)

class Solution { public:int lengthOfLongestSubstring(string s) {if (s.size() == 0) return 0;int Max = INT_MIN;int size = s.size();set<char> set;deque<char> deq;for (int i = 0; i < size; i++) {if (set.insert(s[i]).second) {deq.push_back(s[i]);if(i == size-1) Max = max((int)deq.size(), Max);}else{Max = max((int)deq.size(), Max); while (!deq.empty()) {set.erase(deq.front());deq.pop_front();if(set.insert(s[i]).second) {deq.push_back(s[i]);break;}}}}return Max;} };

C++(題解)

class Solution { public:int lengthOfLongestSubstring(string s) {map<char,int> map;int size = s.size();int result=0;for (int left = 0, right = 0; right < size; right++) {if(map.find(s[right])!=map.end()) {left =max(map[s[right]]+1, left);}result = max(result, right - left + 1);map[s[right]] = right;}return result;} };

C++終極簡化版:

class Solution { public:int lengthOfLongestSubstring(string s) {int arr[256]={0};int size = s.size();int result=0;for (int left = 0, right = 0; right < size; right++) {char c=s[right];left=max(arr[c],left);result=max(result,right-left+1);arr[c]=right+1;}return result;} };

3.LeetCode438.找到字符串中所有字母異位詞

class Solution { public:vector<int> findAnagrams(string s, string p) {int sSize = (int)s.size();int pSize = (int)p.size();if(sSize < pSize) return {};vector<int> rs;vector<int> needs(26,0); //pvector<int> window(26,0); //sfor (char c : p) needs[c - 'a']++;int left = 0, right = 0;while (right < sSize) {char charR = s[right++];window[charR - 'a']++;while (window[charR - 'a'] > needs[charR - 'a']) {char charL = s[left];window[charL - 'a']--;left++;}if (right - left == pSize) {rs.push_back(left);}}return rs;} };

總結

以上是生活随笔為你收集整理的滑动窗口解题技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。