一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情。
今天的每日一题略为简单吗,所以决定做两道题
最富有客户的资产量
该题出自力扣的1672题 —— 最富有客户的资产量【简单题】
审题
给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。
客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。
- 依据题意,找出二维数组里面每一个数组的最大总和,简单明了
- 定义一个变量,初始值为0
- 遍历这个二维数组,对于每一个数组的总和进行对比,最终返回这个最大值变量
- 时间复杂度为O(n^2),因为用了双重for循环
- 空间复杂度为O(1)
编码
class Solution {
public int maximumWealth(int[][] accounts) {
int max = 0;
for (int i = 0; i < accounts.length; i++) {
int indexMax = 0;
for (int j = 0;j < accounts[0].length;j++){
indexMax +=accounts[i][j];
}
max = Math.max(max,indexMax);
indexMax = 0;
}
return max;
}
}
从前序与中序遍历序列构造二叉树
该题出自力扣的105题 —— 从前序与中序遍历序列构造二叉树【中等题】,这题是今天的第二道题,虽然做出来了,但是对于回溯的理解依然没有那种得心应手的感觉
审题
- 依据题意,就是给出一个二叉树的前序遍历(int数组)和中序遍历(int数组),返回一个层序遍历的数组
- 首先需要知道,前序遍历 —— 中左右;中序遍历 —— 左中右;
- 根据以上两个规则,首先就可以确定根节点,就是前序遍历数组的第一个数
- 在中序遍历的数组中找到根节点所在的位置,则根节点之前的为左子树,根节点之后的为右子树
- 根据上述的左右子树数量,可以在前序遍历的数组中确定左右子树的相对位置
- 递归以上的步骤
- 利用代码实现上述的步骤即可、
编码
public TreeNode buildTree(int[] preorder, int[] inorder) {
//preorder 为前序(中左右) inorder为中序(左中右)
return buildTreeHelper(preorder,0,preorder.length,inorder,0,inorder.length);
}
public TreeNode buildTreeHelper(int[] preorder,int startP,int endP,int[] inorder,int startO,int endO){
//preorder 为空,直接翻null
if (startP == endP)return null;
int preRoot = preorder[startP];
TreeNode root = new TreeNode(preRoot);
int inRoot = 0;
for (int i = startO;i<endO;i++){
if (inorder[i] == preRoot){
inRoot = i;
break;
}
}
int leftNum = inRoot - startO;
root.left = buildTreeHelper(preorder,startP+1,startP + leftNum +1,inorder,startO,inRoot);
root.right = buildTreeHelper(preorder,startP+leftNum+1,endP,inorder,inRoot+1,endO);
return root;
}