二叉树的层序遍历
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
用递归从上到下遍历,再反转
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> list = new ArrayList<>();
traverse(root,0,list);
List<Integer> temp;
for (int i=0,len = list.size(); i<len/2;i++){
temp = list.get(i);
list.set(i,list.get(list.size()-1-i));
list.set(len-1-i,temp);
}
return list;
}
private void traverse(TreeNode node,int k,List<List<Integer>> list){
if (node == null)
return;
if (list.size() == k){
list.add(new ArrayList<>());
}
list.get(k).add(node.val);
if (node.left != null)
traverse(node.left,k+1,list);
if (node.right != null)
traverse(node.right,k+1,list);
}
杨辉三角问题
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
public List<Integer> getRow(int rowIndex) {
Integer []res=new Integer[rowIndex+1];
res[0] = 1;
for (int i = 1;i<=rowIndex;i++){
res[i] = 1; // 最后一位是1 ,新的一行的最后肯定是1
// 每次都是基于前一次计算的结果
for (int j = i-1;j>0;j--){
res[j] = res[j]+res[j-1];
}
}
List<Integer> list = Arrays.asList(res);
return list;
}
两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
- 返回的下标值(index1 和 index2)不是从零开始的。
- 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
前后指针,因为是有序的,所以numbers[left] + numbers[right] < target ,就大点所以left++ ,> 的话就变小点right-- ,== 就是找到了。
public int[] twoSum(int[] numbers, int target) {
int left = 0;
int right = numbers.length - 1;
while (left < right){
if (numbers[left] + numbers[right] < target){
left++;
} else if (numbers[left] + numbers[right] > target){
right--;
} else {
return new int[]{left+1,right+1};
}
}
return null;
}