JZ28 对称的二叉树
题源 👉 对称的二叉树_牛客题霸_牛客网 (nowcoder.com)
题目描述:
具体实现:
方法一:源自 👉 【宫水三叶の 剑指精选】从更深的角度看待「对称二叉树」问题_牛客博客 (nowcoder.net)
import java.util.*;
class Solution {
int INF = 0x3f3f3f3f;
TreeNode emptyNode = new TreeNode(INF);
boolean isSymmetrical(TreeNode root) {
if (root == null) return true;
Deque<TreeNode> d = new ArrayDeque<>();
d.add(root);
while (!d.isEmpty()) {
int size = d.size();
List<Integer> list = new ArrayList<>();
while (size-- > 0) {
TreeNode poll = d.pollFirst();
if (!poll.equals(emptyNode)) {
d.addLast(poll.left != null ? poll.left : emptyNode);
d.addLast(poll.right != null ? poll.right : emptyNode);
}
list.add(poll.val);
}
if (!check(list)) return false;
}
return true;
}
boolean check(List<Integer> list) {
int l = 0, r = list.size() - 1;
while (l < r) {
if (!list.get(l).equals(list.get(r))) return false;
l++;
r--;
}
return true;
}
}
时间:O(n)
空间:O(n)
JZ39 数组中出现次数超过一半的数字
题源 👉 数组中出现次数超过一半的数字_牛客题霸_牛客网 (nowcoder.com)
题目描述:
具体实现:
- 方法一:
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int n = array.length;
Arrays.sort(array);
int cnt = 1;
int i = 0;
for(; i < n - 1; i++){
if(array[i] == array[i + 1]) cnt++;
else cnt = 1;
if(cnt > n/2) break;
}
return array[i];
}
}
时间:O(nlog2n)
空间:O(1)
- 方法二:哈希表
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int n = array.length;
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < n; i++){
map.put(array[i], map.getOrDefault(array[i], 0) + 1);
if(map.get(array[i]) > n / 2)
return array[i];
}
return -1; // 不满足时
}
}
时间:O(n)
空间:O(n)
- 方法三:摩尔投票 (方法及图片来自👉 【宫水三叶の剑指精选】一题双解 : 简单题学摩尔投票(一道容易被拓展空间优化简单题)_牛客博客 (nowcoder.net)
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int n = array.length;
int x = -1, cnt = 0;
for(int i : array){
if(cnt == 0){
x = i;
cnt = 1;
}else{
if(i == x) cnt += 1;
else cnt += -1;
// 可以写成 cnt += x == i ? 1 : -1;
}
}
cnt = 0;
for(int i : array)
if(x == i) cnt++;
return cnt > n / 2 ? x : -1;
}
}
JZ40 最小的k个数
题源 👉 最小的K个数_牛客题霸_牛客网 (nowcoder.com)
题目描述
具体实现:
方法一:
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> res = new ArrayList<>();
if(k == 0 || input.length == 0) return res;
// 大根堆
PriorityQueue<Integer> q = new PriorityQueue<>((o1, o2)->o2.compareTo(o1));
// 构建一个k大小堆
for(int i = 0; i < k; i++) q.offer(input[i]);
for(int i = k; i < input.length; i++){
if(q.peek() > input[i]){
q.poll();
q.offer(input[i]);
}
}
// 堆中元素取出入数组
for(int i = 0; i < k; i++)
res.add(q.poll());
Collections.reverse(res);
return res;
}
时间:O(nlog2k)
空间:O(k)