LC17. 电话号码的字母组合
//也是一道经典的回溯题型,主要考察对递归参数以及其他的API的调用
class Solution {
public List<String> letterCombinations(String digits) {
List<String> combinations = new ArrayList();
if(digits.length() == 0)
return combinations;
Map<Character,String> phoneMap = Map.of(
'2',"abc",'3',"def",'4',"ghi",'5',"jkl",
'6',"mno",'7',"pqrs",'8',"tuv",'9',"wxyz"
);
backtrace(combinations,digits,0,phoneMap,new StringBuffer());
return combinations;
}
public void backtrace(List<String> combinations,String digits,int index,Map<Character,String> phoneMap,StringBuffer combination){
if(index == digits.length()){
combinations.add(combination.toString());
}else{
char digit = digits.charAt(index);
String letters = phoneMap.get(digit);
int lettersCount = letters.length();
for(int i = 0;i < lettersCount;i++){
combination.append(letters.charAt(i));
backtrace(combinations,digits,index + 1,phoneMap,combination);
combination.deleteCharAt(index);
}
}
}
}
LC222. 完全二叉树的节点个数
//直接递归调用查找即可
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int countNodes(TreeNode root) {
if(root == null)
return 0;
int left = countNodes(root.left);
int right = countNodes(root.right);
return left + right + 1;
}
}
LC167. 两数之和 II - 输入有序数组
//采用做右指针,因为数组是升序,所以可以不断收缩左右边界进行查找。
class Solution {
public int[] twoSum(int[] numbers, int target) {
int left = 0,right = numbers.length - 1;
while(left < right){
int sum = numbers[left] + numbers[right];
if(sum == target){
return new int[]{left + 1,right + 1};
}else if(sum < target){
left++;
}else{
right--;
}
}
return new int[]{-1,-1};
}
}