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;
}
}