题
今天的题比较简单。
思
今天的代码的效率还可以。
第一题
dfs找一下求一下目标节点的深度和父亲,然后两个目标节点的深度一样,父亲不一样就说明是堂兄弟节点。
第二题
从大到小加过去就行了。
第三题
以前做过,也没啥好说的,这题挺没意思的,写起来麻烦一些,模拟就行了。
代码
第一题
/**
* 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 boolean isCousins(TreeNode root, int x, int y) {
if (root.val == x || root.val == y) {
return false;
}
int[] infox = dfs(root, x, 0);
int[] infoy = dfs(root, y, 0);
return infox[0] == infoy[0] && infox[1] != infoy[1];
}
private int[] dfs(TreeNode node, int x, int dept) {
if (node.left != null && node.left.val == x) {
return new int[] { dept + 1, node.val };
}
if (node.right != null && node.right.val == x) {
return new int[] { dept + 1, node.val };
}
if (node.left != null) {
int[] res = dfs(node.left, x, dept + 1);
if (res != null) {
return res;
}
}
if (node.right != null) {
int[] res = dfs(node.right, x, dept + 1);
if (res != null) {
return res;
}
}
return null;
}
}
第二题
class Solution {
public boolean checkPowersOfThree(int n) {
int[] pow = new int[15];
for (int i = 0; i < pow.length; i++) {
pow[i] = (int) Math.pow(3, i);
}
for (int i = 14; i >= 0; i--) {
if (pow[i] == n) {
return true;
} else if (pow[i] > n) {
continue;
} else {
n -= pow[i];
}
}
return false;
}
}
第三题
class Solution {
public List<Integer> findSubstring(String s, String[] words) {
int len = words.length * words[0].length();
List<Integer> res = new ArrayList<Integer>();
if (s.length() < len) {
return res;
}
Map<String, Integer> ans = new HashMap<String, Integer>();
for (String word : words) {
ans.put(word, ans.getOrDefault(word, 0) + 1);
}
for (int i = 0; i + len <= s.length(); i++) {
if (compare(ans, s, i, words[0].length(), words.length)) {
res.add(i);
}
}
return res;
}
private boolean compare(Map<String, Integer> map, String s, int idx, int wordLen, int count) {
Map<String, Integer> temp = new HashMap<String, Integer>();
int c = 0;
while (c < count) {
String substring = s.substring(idx, idx + wordLen);
if (!map.containsKey(substring)) {
return false;
}
temp.put(substring, temp.getOrDefault(substring, 0) + 1);
c++;
idx += wordLen;
}
for (String word : map.keySet()) {
if (!temp.containsKey(word)) {
return false;
} else if (!temp.get(word).equals(map.get(word))) {
return false;
}
}
return true;
}
}