leetcode 27场双周赛思路

由于没时间参加 这里说下思路

1 通过翻转子数组使两个数组相等 比较两个数组是否能够通过转换子数组获得 其实就是比对里面的元素是否相同 排序并比较就好了 

class Solution {
public:
    bool canBeEqual(vector<int>& target, vector<int>& arr) {
        sort(target.begin(),target.end());
        sort(arr.begin(),arr.end());
        
        return target==arr;
    }
};

 

检查一个字符串是否包含所有长度为 K 的二进制子串 根据指定的长度 用双指针记录获取的字符串 如果获取的类型数目 等于改长度01能组成的所有类型 则说明包含

这里放一个很简短的代码 缺点是可能运行时间太长 后期可能会被判定tle

class Solution {
public:
    bool hasAllCodes(string s, int k) {
        unordered_set<string> ss;
        for(int l =0;l<s.size();l++){
            int r = l+k-1;
            if(r>= s.size()) break;
            ss.insert(s.substr(l,k));
            if(ss.size() == 1<<k) return true;
        }
          
        return ss.size() == 1<<k;
        
    }
};

 

课程安排 IV  闭包传递。这里使用的是哈希记录每个点的先修点,加速查找

 1 class Solution {
 2 public:
 3    
 4     vector<bool> checkIfPrerequisite(int n, vector<vector<int>>& prerequisites, vector<vector<int>>& queries) {
 5     unordered_map<int, unordered_set<int>> ms(n + 10);
 6 
 7     for (auto& e : prerequisites) {
 8         int a = e[0];
 9         int b = e[1];
10 
11         ms[b].insert(a);
12     }
13     vector<bool> ret;
14     int vis[110] = { 0 };
15     for (auto& e : queries) {
16         int a = e[0];
17         int b = e[1];
18         memset(vis, 0, sizeof(vis));
19 
20         if (ms[b].count(a) != 0) {
21             ret.push_back(true);
22             continue;
23         }
24         queue<int> Q;
25         for (auto& e : ms[b]) {
26             Q.push(e);
27         }
28         int find = 0;
29         //bfs查找
30         while (!Q.empty()) {
31             int ele = Q.front(); Q.pop();
32             if (vis[ele] == 1) continue;
33             vis[ele] = 1;
34             if (ms[ele].count(a) != 0) {
35                 ret.push_back(true);
36                 find = 1;
37                 break;
38             }
39 
40             for (auto& e : ms[ele]) {
41                 Q.push(e);
42             }
43         }
44         if (find == 0) {
45             ret.push_back(false);
46         }
47 
48     }
49 
50 
51     return ret;
52 }
53     
54 };
View Code

 上面的代码现在判定为TLE了 超时 过不了。

我们也可以使用floyd算法,计算每个点之间是否有路线可以到达即可

class Solution {
public:
    vector<bool> checkIfPrerequisite(int n, vector<vector<int>>& prerequisites, vector<vector<int>>& queries) {
        vector<vector<int>> graph(150,vector<int>(150,99990));
    
        for(int i =0;i < prerequisites.size();i++){
            int a = prerequisites[i][0];
            int b = prerequisites[i][1];
            
            graph[a][b] = 1;
        }
        
        for (int k = 0; k < n; k ++ )
            for (int i = 0; i < n; i ++ )
                for (int j = 0; j < n; j ++ )
                    graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]);
        
         vector<bool> ret;
        for(int i = 0; i < queries.size();i++ ){
            int a = queries[i][0];
            int b = queries[i][1];
            
            if(graph[a][b] > 99990/2){
                ret.push_back(false);
            }else{
                ret.push_back(true);   
            }
        }

        return ret;
    }
};

 

摘樱桃 II 动态规划

posted on 2020-05-30 22:59  itdef  阅读(190)  评论(0编辑  收藏  举报

导航