LeetCode 632. 最小区间 (哈希表+滑动窗口)

最小区间
如果用滑动窗口,要先会做这道题,最小覆盖子串
这种求满足条件的最长区间或者最短区间问题,很多时候都可以用滑动窗口解决。

class Solution {
public:
    map<int,vector<int>> mp;
    vector<int> smallestRange(vector<vector<int>>& nums) {
        vector<int> ans = {-100000,100000+1};
        for(int i=0;i<nums.size();i++){
            for(int j=0;j<nums[i].size();j++){
                mp[ nums[i][j] ].push_back(i);;
            }
        }
        vector<int> a;
        for(auto it:mp){
            a.push_back(it.first);
        }

        int k = nums.size(), cnt = 0, n = a.size();
        vector<int> vis(k,0);
        int l = 0, r = 0;
        
        while(l<n){
            while(r<n && cnt<k){
                vector<int>& v = mp[ a[r] ];
                for(int x:v){
                    if(vis[x]==0){
                        cnt++;
                    }
                    vis[x]++;
                }
                r++;
            }
            if(cnt==k){
                if(  (a[r-1]-a[l])<(ans[1]-ans[0]) || (a[r-1]-a[l])==(ans[1]-ans[0]) && a[r-1]<ans[1] )
                ans = {a[l],a[r-1]};
            } 

            vector<int>& v = mp[ a[l] ];
            for(int x:v){
                vis[x]--;
                if(vis[x]==0){
                    cnt--;
                }
            }            

            l++;
        }
        return ans;
    }
};

/*

k个列表
0: [-1, 2, 3]
1: [1]
2: [1, 2]
3: [1, 1, 1 ,3]

哈希映射
-1: [0]
 1: [1, 2, 3, 3, 3]
 2: [0, 2]
 3: [0, 3]

*/

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/107727630