数据流中的中位数&&N皇后问题&&字典树的实现

154 阅读2分钟

NC131 数据流中的中位数

题目链接

1、解题思路

按照大小顶堆的做法。小顶堆存放大的一半的元素,大顶堆存放小的一半的元素。在插入元素的时候始终保证小顶堆的元素不小于大顶堆的元素。

2、代码
import java.util.*;
public class Solution {

    // 小顶堆 放右边的元素
    private PriorityQueue<Integer> less = new PriorityQueue<>(new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o1.intValue() - o2.intValue();
        }
    });

    // 大顶堆 放左边元素
    private PriorityQueue<Integer> greater = new PriorityQueue<>(new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o2.intValue() - o1.intValue();
        }
    });

    public void Insert(Integer num) {
        if (greater.isEmpty() || num < greater.peek()) {
            greater.add(num);
            if (greater.size() > less.size() + 1) {
                less.add(greater.poll());
            }
        } else {
            less.add(num);
            if (greater.size() < less.size()) {
                greater.add(less.poll());
            }
        }
    }

    public Double GetMedian() {
        if (greater.size() == less.size()) {
            return (greater.peek() + less.peek()) / 2.0;
        } else {
            return greater.peek() * 1.0;
        }
    }
}

NC39 N皇后问题

题目链接

1、解题思路

经典DFS,只是判断合法性会麻烦一点。

2、代码
import java.util.*;


public class Solution {
    /**
     * 
     * @param n int整型 the n
     * @return int整型
     */
    private int ans = 0;

    private boolean judge(int r, int c, int[][] maps) {
        for (int i = 1; i < maps.length; i++) {
            if (maps[r][i] == 1 || maps[i][c] == 1) {
                return false;
            }
        }
        int n = maps.length - 1;
        int tr = r, tc = c;
        while (tr <= n && tc <= n) {
            if (maps[tr][tc] == 1) {
                return false;
            }
            tr++;
            tc++;
        }
        tr = r;
        tc = c;
        while (tr <= n && tc >= 1) {
            if (maps[tr][tc] == 1) {
                return false;
            }
            tr++;
            tc--;
        }
        tr = r;
        tc = c;
        while (tr >= 1 && tc <= n) {
            if (maps[tr][tc] == 1) {
                return false;
            }
            tr--;
            tc++;
        }
        tr = r;
        tc = c;
        while (tr >= 1 && tc >= 1) {
            if (maps[tr][tc] == 1) {
                return false;
            }
            tr--;
            tc--;
        }
        return true;
    }

    private void dfs(int cur, int n, int[][] maps) {
        if (cur == n + 1) {
            ans++;
        } else {
            for (int i = 1; i <= n; i++) {
                if (judge(cur, i, maps)) {
                    maps[cur][i] = 1;
                    dfs(cur + 1, n, maps);
                    maps[cur][i] = 0;
                }
            }
        }
    }

    public int Nqueen(int n) {
        int[][] maps = new int[n + 1][n + 1];
        dfs(1, n, maps);
        return this.ans;
    }
}

NC124 字典树的实现

题目链接

1、解题思路

字典树操作,处理细节就好。

2、代码
import java.util.*;


public class Solution {
    /**
     * 
     * @param operators string字符串二维数组 the ops
     * @return string字符串一维数组
     */
    class TrieTree {

        class TrieNode {
            public TrieNode() {
                next = new TrieNode[26];
                prefixNum = 0;
                end = false;
            }

            TrieNode next[];
            int prefixNum;
            boolean end;
        }

        TrieNode root;

        public TrieTree() {
            this.root = new TrieNode();
        }

        void insert(String word) {
            TrieNode node = root;
            for (char c : word.toCharArray()) {
                if (node.next[c - 'a'] == null) {
                    node.next[c - 'a'] = new TrieNode();
                }
                node = node.next[c - 'a'];
                node.prefixNum++;
            }
            node.end = true;
        }

        void delete(String word) {
            TrieNode node = root;
            for (char c : word.toCharArray()) {
                if (node.next[c - 'a'] == null) {
                    return;
                }
                node = node.next[c - 'a'];
                node.prefixNum--;
            }
            if (node.prefixNum == 0) {
                node.end = false;
            }
        }

        boolean search(String word) {
            TrieNode node = root;
            for (char c : word.toCharArray()) {
                if (node.next[c - 'a'] == null) {
                    return false;
                }
                node = node.next[c - 'a'];
            }
            return node.end;
        }

        int prefixNumber(String word) {
            TrieNode node = root;
            for (char c : word.toCharArray()) {
                if (node.next[c - 'a'] == null) {
                    return 0;
                }
                node = node.next[c - 'a'];
            }
            return node.prefixNum;
        }

    }

    public String[] trieU(String[][] operators) {
        TrieTree trieTree = new TrieTree();
        ArrayList<String> strings = new ArrayList<>();
        for (String[] operator : operators) {
            String oper = operator[0];
            String arg = operator[1];
            if (oper.equals("1")) {
                trieTree.insert(arg);
            } else if (oper.equals("2")) {
                trieTree.delete(arg);
            } else if (oper.equals("3")) {
                boolean search = trieTree.search(arg);
                if (search) {
                    strings.add("YES");
                } else {
                    strings.add("NO");
                }
            } else if (oper.equals("4")) {
                strings.add(String.valueOf(trieTree.prefixNumber(arg)));
            }
        }
        String[] ret = new String[strings.size()];
        for (int i = 0; i < ret.length; i++) {
            ret[i] = strings.get(i);
        }
        return ret;
    }
}