美文网首页
LeetCode 97周赛

LeetCode 97周赛

作者: crishawy | 来源:发表于2019-10-07 17:27 被阅读0次

1. 题目列表

2. 两句话中的不常见单词

hashmap按条件查询单词。

代码:

class Solution {
    public String[] uncommonFromSentences(String A, String B) {
        List<String> res = new ArrayList<String>();
        HashMap<String, Integer> map1 = new HashMap<String, Integer>();
        HashMap<String, Integer> map2 = new HashMap<String, Integer>();
        String[] s1 = A.split(" ");
        String[] s2 = B.split(" ");
        for (String s : s1){
            // System.out.println(s);
            if (map1.get(s) == null){
                map1.put(s, 1);
            }else{
                map1.put(s, map1.get(s) + 1);
            }
        }
        for (String s : s2){
            if (map2.get(s) == null){
                map2.put(s, 1);
            }else{
                map2.put(s, map2.get(s) + 1);
            }
        }
        for (String s : s1){
            if (map1.get(s) == 1 && map2.get(s) == null)
                res.add(s);
        }
        for (String s : s2){
            if (map2.get(s) == 1 && map1.get(s) == null)
                res.add(s);
        }
        return res.toArray(new String[res.size()]);
    }
}

3. 螺旋矩阵 III

定义移动的步长S,当前的方向direct,分情况讨论当前的方向。 步长的移动规律是每次移动两次相同的步长S后,S++。

代码:

class Solution {
public:
    
    vector<vector<int>> spiralMatrixIII(int R, int C, int r0, int c0) {
        int r = r0, c = c0, direct = 1, step = 1, prestep = 0;
        int cnt = 1;
        vector< vector<int> > res;
        vector<int> init(2);
        init[0] = r0, init[1] = c0;
        res.push_back(init);
        while (cnt < R * C){
            vector<int> coor(2);
            if (direct == 1){
                // 遍历的每一个步都需要判断是否是答案路径
                for (int i = 1; i <= step; i++){
                    c++;
                    if (judge(r, c, R, C)){
                        coor[0] = r, coor[1] = c;
                        res.push_back(coor);
                        cnt++;
                    }
                }
                direct = 2;
            }else if (direct == 2){
                for (int i = 1; i <= step; i++){
                    r++;
                    if (judge(r, c, R, C)){
                        coor[0] = r, coor[1] = c;
                        res.push_back(coor);
                        cnt++;
                    }
                }
                direct = 3;
            }else if (direct == 3){
                for (int i = 1; i <= step; i++){
                    c--;
                    if (judge(r, c, R, C)){
                        coor[0] = r, coor[1] = c;
                        res.push_back(coor);
                        cnt++;
                    }
                }
                direct = 0;
            }else if (direct == 0){
                for (int i = 1; i <= step; i++){
                    r--;
                    if (judge(r, c, R, C)){
                        coor[0] = r, coor[1] = c;
                        res.push_back(coor);
                        cnt++;
                    }
                }
                direct = 1;
            }
            if (prestep == step){
                step++;
            }else{
                prestep = step;
            }
        }
        return res;
    }
    
    bool judge(int r, int c, int R, int C){
        if (r < 0 || r >= R || c < 0 || c >= C)
            return false;
        else return true;
    }
};

4. 可能的二分法

BFS染色法判断是否是二分图,如果存在相邻的结点颜色相同,则返回false,否则返回true。

代码:

class Solution {
public:
    /*
        BFS染色法判断是否是二分图,如果存在相邻的结点颜色相同,则返回false,否则返回true
    */
    bool visited[2010];
    int g[2010][2010], color[2010];
    bool possibleBipartition(int N, vector<vector<int>>& dislikes) {
        memset(visited, false, sizeof(visited));
        memset(color, 0, sizeof(color));
        fill(g[0], g[0] + 2010 * 2010, 0x7fffffff);
        for (int i = 0; i < dislikes.size(); i++){
            g[dislikes[i][0]][dislikes[i][1]] = g[dislikes[i][1]][dislikes[i][0]] = 1;
        }
        bool flag = true;
        for (int i = 1; i <= N; i++){
            if (!visited[i] && !BFS(i, 1, N)){
                flag = false;
                break;
            }
        }
        return flag;
    }
    
    bool BFS(int s, int c, int n){
        queue< pair<int, int> > q;
        q.push(make_pair(s, c));
        visited[s] = true;
        while (!q.empty()){
            pair<int, int > u = q.front();
            q.pop();
            color[u.first] = u.second;
            for (int i = 1; i <= n; i++){
                // 如果存在邻接点染色相同
                if (g[u.first][i] == 0x7fffffff) continue;
                if (color[i] == u.second) return false;
                if (!visited[i]){
                    q.push(make_pair(i, -u.second)); // 染成相反的颜色
                    visited[i] = true;
                }
            }
        }
        return true;
    }
    
};

相关文章

  • leetcode周赛

    第一周 1029 可被五整除的二进制前缀 每次循环将前缀乘以二即可题型:数学 1030 链表中的下一个最大节点 要...

  • 5670. 互质树

    LeetCode 第46场周赛 dfs+一点利用数据范围的trick

  • LeetCode 122周赛

    1. 题目列表 查询后的偶数和(简单模拟) 从叶结点开始的最小字符串(二叉树深搜 + 字符串比较) 区间列表的交集...

  • LeetCode 149 周赛

    1. 题目列表 一年中的第几天(简单) 投掷骰子的N种方法(背包问题求方案数) 单字符重复子串的最大长度 子数组种...

  • LeetCode 143周赛

    1. 题目列表 分糖果 II(简单模拟) 二叉树寻路(z型规律,完全二叉树的性质) 填充书架(dp,二重循环dp,...

  • LeetCode 144周赛

    1. 题目列表 IP 地址无效化(一行代码) 航班预订统计(问题转换,给定区间数据,求每个点的值,公交车站问题)重...

  • LeetCode 152周赛

    1. 题目列表 质数排列(简单排列组合) 健身计划评估(简单模拟) 构建回文串检测(字符个数的前缀和) 猜字谜(字...

  • LeetCode 132周赛

    1. 题目列表 除数博弈(一维简单动态规划) 节点与其祖先之间的最大差值(DFS,求最大差值) 最长等差数列(二维...

  • LeetCode 128周赛

    1. 题目列表 十进制整数的反码(进制转换) 总持续时间可被 60 整除的歌曲(数组hash以及简单的排列组合) ...

  • LeetCode 97周赛

    1. 题目列表 两句话中的不常见单词(模拟hashmap) 螺旋矩阵 III(二维网格行走模拟) 可能的二分法(判...

网友评论

      本文标题:LeetCode 97周赛

      本文链接:https://www.haomeiwen.com/subject/zvrgectx.html