如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true
;否则返回 false
。
输入:[1,1,1,1,1,null,1]
输出:true
class Solution {
public boolean isUnivalTree(TreeNode root) {
if (root == null) {
return true;
}
return judge(root, root.val);
}
public boolean judge(TreeNode root, int val) {
if (root == null) {
return true;
}
if (root.val != val) {
return false;
}
return judge(root.left, val) && judge(root.right, val);
}
}
计算给定二叉树的所有左叶子之和。
示例:
3
/ \
9 20
/ \
15 7
在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null)
return 0;
return dfs(root);
}
public boolean isLeafNode(TreeNode root) {
if (root.left == null && root.right == null) {
return true;
} else {
return false;
}
}
public int dfs(TreeNode root){
int sum = 0;
if(root.left != null) {
if(isLeafNode(root.left)) {
sum += root.left.val;
}
else {
sum += dfs(root.left);
}
}
if (root.right != null && !isLeafNode(root.right)) {
sum += dfs(root.right);
}
return sum;
}
}
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 "Aa"
不能当做一个回文字符串。
注意: 假设字符串的长度不会超过 1010。
示例 1:
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
class Solution {
public int longestPalindrome(String s) {
int[] count = new int[128];
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
count[ch]++;
}
int ans = 0;
for (int v : count) {
ans += v / 2 * 2;
if (v % 2 == 1 && ans % 2 == 0) {
ans++;
}
}
return ans;
}
}
给定一个包含 n 个整数的数组 nums
和一个目标值 target
,判断 nums
中是否存在四个元素 *a,*b,c 和 d ,使得 a + b + c + d 的值与 target
相等?找出所有满足条件且不重复的四元组。
**注意:**答案中不可以包含重复的四元组。
示例 1:
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> ans = new ArrayList();
if (nums.length < 4) {
return ans;
}
Arrays.sort(nums);
int length = nums.length;
for (int i = 0; i < length - 3; i++) {
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
if (nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) {
break;
}
if (nums[i] + nums[length - 3] + nums[length - 2] + nums[length - 1] < target) {
continue;
}
for (int j = i + 1; j < length - 2; j++) {
if (j > i + 1 && nums[j] == nums[j - 1]) {
continue;
}
if (nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target) {
break;
}
if (nums[i] + nums[j] + nums[length - 2] + nums[length - 1] < target) {
continue;
}
int left = j + 1;
int right = length - 1;
while (left < right) {
int sum = nums[i] + nums[j] + nums[left] + nums[right];
if (sum == target) {
ans.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
while (left < right && nums[left] == nums[left + 1]){
left ++;
}
left ++;
while (left < right && nums[right] == nums[right - 1]) {
right--;
}
right--;
} else if (sum > target) {
right--;
} else {
left++;
}
}
}
}
return ans;
}
}