4.20
面试题32 - III. 从上到下打印二叉树 III
思路:
- 先存下各层树的层次遍历节点,
- 再按照s型遍历这些节点的值保存下来
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<TreeNode>> result=new ArrayList<>();
List<List<Integer>> result2=new ArrayList<>();
if(root==null)
{
return result2;
}
List<TreeNode> oList=new ArrayList<>();
oList.add(root);
result.add(oList);
while(true)
{
List<TreeNode> treeNodes=result.get(result.size()-1);
List<TreeNode> list=new ArrayList<>();
for(int i=0;i<treeNodes.size();i++)
{
TreeNode treeNode=result.get(result.size()-1).get(i);
if(treeNode.left!=null)
{
list.add(treeNode.left);
}
if(treeNode.right!=null)
{
list.add(treeNode.right);
}
}
if(list.size()==0)
{
break;
}
result.add(list);
}
int n=0;
for(int j=0;j<result.size();j++)
{
List<Integer> list=new ArrayList<>();
if(n==0)
{
for(int q=0;q<result.get(j).size();q++)
{
list.add(result.get(j).get(q).val);
}
n=1;
}
else if(n==1)
{
for(int q=result.get(j).size()-1;q>=0;q--)
{
list.add(result.get(j).get(q).val);
}
n=0;
}
result2.add(list);
}
return result2;
}
}
评价:
883. 三维形体投影面积
思路:
- 从上看:非0个数
- 从左看:每行的最大值相加
- 从右看:每列的最大值相加
代码:
class Solution {
public int projectionArea(int[][] grid) {
int sum1=0;
int sum2=0;
for(int i=0;i<grid.length;i++)
{
int max=0;
for(int j=0;j<grid[0].length;j++)
{
if(grid[i][j]!=0)
{
sum1+=1;
}
if(grid[i][j]>max)
{
max=grid[i][j];
}
}
sum2=max+sum2;
}
int sum3=0;
for(int i=0;i<grid[0].length;i++)
{
int max=0;
for(int j=0;j<grid.length;j++)
{
if(grid[j][i]>max)
{
max=grid[j][i];
}
}
sum3=max+sum3;
}
System.out.println("sum1:"+sum1);
System.out.println("sum2:"+sum2);
System.out.println("sum3:"+sum3);
return sum1+sum2+sum3;
}
}
评价:
1262. 可被三整除的最大和
思路:
- 遍历一遍数组,计算数组的总和,保存下除3余1的最小的两个和除三余二的最小的两个
- 若总和可以被三除尽,则直接返回
- 若总和余1,减去余二的最小的两个或者减去余1的最小那个(看哪部分小)
- 若总和余2,减去余一的最小的两个或者减去余2的最小那个(看哪部分小)
- 时间复杂度:O(N) 空间复杂度:O(1)
代码:
class Solution {
public int maxSumDivThree(int[] nums) {
int sum=0;
int min11=Integer.MAX_VALUE;
int min12=Integer.MAX_VALUE;
int min21=Integer.MAX_VALUE;
int min22=Integer.MAX_VALUE;
for(int i=0;i<nums.length;i++)
{
sum=sum+nums[i];
if(nums[i]%3==1)
{
if(nums[i]<min11)
{
min12=min11;
min11=nums[i];
}
else if(nums[i]<min12)
{
min12=nums[i];
}
}
else if(nums[i]%3==2)
{
if(nums[i]<min21)
{
min22=min21;
min21=nums[i];
}
else if(nums[i]<min22)
{
min22=nums[i];
}
}
}
System.out.println(min11);
System.out.println(min12);
System.out.println(min21);
System.out.println(min22);
if(sum%3==1)
{
if(min21!=Integer.MAX_VALUE&&min22!=Integer.MAX_VALUE)
{
if(min21+min22<min11)
{
sum=sum-min21-min22;
}
else {
sum=sum-min11;
}
}
else {
sum=sum-min11;
}
return sum;
}
if(sum%3==2)
{
if(min11!=Integer.MAX_VALUE&&min12!=Integer.MAX_VALUE)
{
if(min11+min12<min21)
{
sum=sum-min11-min12;
}
else {
sum=sum-min21;
}
}
else {
sum=sum-min21;
}
return sum;
}
return sum;
}
}