算法--2023.1.17
1.力扣236--二叉树的最近公共祖先
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null){
return root;
}
//如果根结点是p或者q,则根结点就是最近的公共祖先
if(root == p || root ==q){
return root;
}
//否则,递归的遍历根结点的左子树是否有公公祖先,右子树是否有公共祖先
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
//如果左右子树都有公公祖先,则返回根结点
if(left!=null&&right!=null){
return root;
//否则返回左子树或者右子树节点
}else if(left!=null){
return left;
}else{
return right;
}
}
}
2.力扣238--除自身以外数组的乘积
class Solution {
public int[] productExceptSelf(int[] nums) {
int n = nums.length;
//前缀乘积数组,后缀乘积数组,类似于前缀和与后缀和
int[] preMulti = new int[n+1], postMulti = new int[n+2];
preMulti[0] = 1; postMulti[n+1] = 1;
for(int i = 1;i<=n;i++){
preMulti[i] = nums[i-1]*preMulti[i-1];
}
for(int i = n;i>=1;i--){
postMulti[i] = postMulti[i+1] * nums[i-1];
//System.out.println(postMulti[i]);
}
int[] res = new int[n];
for(int i = 0;i<n;i++){
res[i] = preMulti[i] * postMulti[i+2];
}
return res;
}
}
3.力扣239--滑动窗口的最大值
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
//维护一个滑动窗口,该滑动窗口由一个单调队列作为容器
Deque<Integer> queue = new LinkedList<>();
int n = nums.length;
int[] res = new int[n-k+1];
for(int i = 0;i<n;i++){
//每次进入前先判断窗口最左边的值是否要移除
if(!queue.isEmpty()&&i-queue.getFirst()+1>k){
queue.removeFirst();
}
//这里来维护一个单调递减的队列
//队列中新加入的元素一定要把队列中它前面比他大的给移除
while(!queue.isEmpty()&&nums[i]>=nums[queue.getLast()]){
queue.removeLast();
}
queue.addLast(i);
//然后每次输出滑动窗口的第一个元素就可以了
if(i>=k-1){
res[i-k+1] = nums[queue.getFirst()];
}
}
return res;
}
}
理想主义的花终将在现实中绽放

浙公网安备 33010602011771号