Two Pointers - 前向型指针summary

这类题中,Brute Force是扫两次,On2的复杂度。而Brute Force重复计算了元素,所以可以用Two Pointers来优化。

Minimum Size Subarray Sum:

int minimumSize(vector<int> &nums, int s) {
        // write your code here
        if(nums.empty()) return s == 0 ? 0 : -1;
        int start = 0, min_len = nums.size()+1;
        int sum = 0;
        for(int i=0; i<nums.size(); i++){
            sum += nums[i];
            while(sum >= s){
                min_len = min(min_len, i-start+1);
                sum -= nums[start++];
            }
        }
        return min_len == nums.size() + 1 ? -1 : min_len;
    }

Longest Substring Without Repeating Characters:

int lengthOfLongestSubstring(string s) {
        if(s.empty()) return 0;
        unordered_map<char, int> mp;
        int start = 0, max_len = 0;
        for(int i=0; i<s.length(); i++){
            if(mp.count(s[i])){
                start = max(start, mp[s[i]] + 1);
            }
            mp[s[i]] = i;
            max_len = max(max_len, i-start+1);
        }
        return max_len;
    }

Longest Substring with At Most K Distinct Characters:

int lengthOfLongestSubstringKDistinct(string s, int k) {
        // write your code here
        if(s.empty() || k <= 0) return 0;
        int start = 0, max_len = 0;
        unordered_map<int, int> mp;
        for(int i=0; i<s.length(); i++){
            mp[s[i]]++;
            while(mp.size() > k){
                if(--mp[s[start]] == 0) mp.erase(s[start]);
                start++;
            }
            max_len = max(max_len, i-start+1);
        }
        return max_len;
    }

Minimum Window Substring:

string minWindow(string &source, string &target) {
        // write your code here
        unordered_map<char, int> mp;
        for(int i=0; i<target.length(); i++){
            mp[target[i]]++;
        }
        int cnt = 0, left = 0;
        int min_len = INT_MAX, minLeft = 0;
        
        for(int i=0; i<source.length(); i++){
            if(mp.count(source[i])){
                mp[source[i]]--;
                if(mp[source[i]] >= 0) cnt++;
            }
            while(cnt == target.length()){
                if(i-left+1 < min_len){
                    min_len = i-left+1;
                    minLeft = left;
                }
                if(mp.count(source[left])){
                    mp[source[left]]++;
                    if(mp[source[left]] > 0) cnt--;
                }
                left++;
            }
        }
        return min_len == INT_MAX ? "" : source.substr(minLeft, min_len);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • LeetCode 刷题随手记 - 第一部分 前 256 题(非会员),仅算法题,的吐槽 https://leetc...
    蕾娜漢默阅读 17,950评论 2 36
  • second round leetcode57,Insert Interval (Done) 381,Insert...
    Richardo92阅读 687评论 1 0
  • 1、CentOS 下载 centOS下载 2、CentOS安装 1、设置创建好的CentOS 虚拟机 2、在虚拟机...
    J_wxiao阅读 1,345评论 0 3
  • 那年,大学刚毕业的她,独自去苏州的大观音寺游玩。遇见一个许愿塔,于是便掏出一枚硬币,默默许下心愿,向着最高的塔窗投...
    作家明至阅读 261评论 0 1