冲刺大厂每日算法&面试题,动态规划21天——第十八天

「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

导读

在这里插入图片描述

肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。我们先来搞一下让大家最头疼的一类算法题,动态规划我们将进行为时21天的养成计划。还在等什么快来一起肥学进行动态规划21天挑战吧!!

21天动态规划入门

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4复制代码
示例 2:

输入:nums = [0,1,0,3,2,3]
输出:4
复制代码
示例 3:

输入:nums = [7,7,7,7,7,7,7]
输出:1
复制代码
class Solution {
    public int lengthOfLIS(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int[] dp = new int[nums.length];
        dp[0] = 1;
        int maxans = 1;
        for (int i = 1; i < nums.length; i++) {
            dp[i] = 1;
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
            maxans = Math.max(maxans, dp[i]);
        }
        return maxans;
    }
}

复制代码

面试题

继续介绍二叉树的面试题: 构建二叉树节点

package tree;

public class node {
	public int val;
	public node left;//左孩子
	public node right;//右孩子
	public node() {
		
	}
	public node(int val,node left,node right) {
		this.val=val;
		this.left=left;
		this.right=right;
	}
	public node(int val, node left) {
		super();
		this.val = val;
		this.left = left;
	}
	
}

复制代码
public class kTierNums {
	//求第k层节点的个数
	public int kNums(node root,int k) {
		if(root==null||k<1)return 0;
		if(k==1)return 1;
		int leftNum=kNums(root.left,k-1);
		int rightNum=kNums(root.right,k-1);
		return leftNum+rightNum;
	}
	
	
}
复制代码

问:怎么判断是否为平衡二叉树

我先来说一下什么是平衡二叉树

平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。

package tree;

public class AVL {
	//判断是不是平衡二叉树
	public int BalancedTree(node root) {
		if(root==null)return 0;
		int left=BalancedTree(root.left);
		int right=BalancedTree(root.right);
		if(left==-1||right==-1||Math.abs(left-right)>1) {
			return -1;
		}
		return Math.max(left, right)+1;
	}
	public boolean isBalanced(node root) {
		return BalancedTree(root)!=1;
	}
}

复制代码

猜你喜欢

转载自juejin.im/post/7031151818122100766