CodeTop100 Day22
64、组合总和
典型的回溯题,有很多类似的模板,但是要想一想是否可以重复使用,重复使用进入递归还是i,不能重复就是i+1
class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {List<List<Integer>> result=new ArrayList<>();if(candidates==null||candidates.length==0){return result;}backtrcak(candidates,new ArrayList<>(),result,0,target);return result;}private void backtrcak(int[] candidates,List<Integer> current,List<List<Integer>> result,int start,int target){if(target==0){result.add(new ArrayList<>(current));return;}if(target<0){return;}for(int i=start;i<candidates.length;i++){current.add(candidates[i]);backtrcak(candidates,current,result,i,target-candidates[i]);current.remove(current.size()-1);}}
}
65、旋转图像
想明白它是怎么旋转的,规律是什么
首先是根据对角线进行替换:123 456 789->147 258 369然后首尾交换 741 852 963
class Solution {public void rotate(int[][] matrix) {//旋转规则sum[1][m]->sum[m][r],int n=matrix.length;for(int i=0;i<n;i++){for(int j=i;j<n;j++){int temp=matrix[i][j];matrix[i][j]=matrix[j][i];matrix[j][i]=temp;}}for(int i=0;i<n;i++){for(int j=0;j<n/2;j++){int temp=matrix[i][j];matrix[i][j]=matrix[i][n-1-j];matrix[i][n-1-j]=temp;}}}
}
66、二叉树的直径
很显然的思路是对每个节点计算左右子树最大高度,求得每个节点的直径,然后定义一个变量每次更新最大值
class Solution {int max=0;public int diameterOfBinaryTree(TreeNode root) {//给一个结点,返回左子树最大距离+右子树最大距离+1,遍历所有结点,求最大值dep(root);return max;}public int dep(TreeNode node){if(node==null){return 0;}int leftd=dep(node.left);int rightd=dep(node.right);max=Math.max(max,leftd+rightd);return Math.max(leftd,rightd)+1;}
}