1.最长公共前缀
问题描述:
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例:
示例 1:
输入:strs = ["flower","flow","flight"] 输出:"fl"示例 2:
输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。
思路:纵向比较相同列上的字符是否相同,如果相同则继续比较,不同则截取前面相同的部分并返回。
代码:
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0&&strs==null)
return "";
for(int i=0;i<strs[0].length();i++){
char a=strs[0].charAt(i);
for(int j=1;j<strs.length;j++){
if(i==strs[j].length()||a!=strs[j].charAt(i))
return strs[0].substring(0,i);
}
}
return strs[0];
}
}
复杂度分析:
时间复杂度:O(mn)
空间复杂度: O(1)
2.路径总和
问题描述:
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在根节点到 叶子节点的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点是指没有子节点的节点。
示例:
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22 输出:true 解释:等于目标和的根节点到叶节点路径如上图所示。示例 2:
输入:root = [1,2,3], targetSum = 5 输出:false 解释:树中存在两条根节点到叶子节点的路径: (1 --> 2): 和为 3 (1 --> 3): 和为 4 不存在 sum = 5 的根节点到叶子节点的路径。示例 3:
输入:root = [], targetSum = 0 输出:false 解释:由于树是空的,所以不存在根节点到叶子节点的路径。
思路:若当前节点就是叶子节点,则判断sum是否等于val即可,若当前节点不是叶子节点,则只需要递归的询问它的子节点是否能满足条件即可。
代码:
class Solution {
public boolean hasPathSum(TreeNode root, int sum) {
if(root == null){
return false;
}
sum -= root.val;
if(root.left == null && root.right == null){
return sum == 0;
}else{
return hasPathSum(root.left,sum) || hasPathSum(root.right,sum);
}
}
}
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(h)