二叉树中的第K大层和
题目
2583. 二叉树中的第 K 大层和 - 力扣(LeetCode)
思路
递归计算每层的和,然后排序获得第k个最大和
代码
public long kthLargestLevelSum(TreeNode root, int k) {
if (root == null) {
return -1;
}
List<Long> list = new ArrayList<>();
fun(list, root, 0);
list.sort(Comparator.reverseOrder());
if (list.size() < k) {
return -1;
}
return list.get(k - 1);
}
private void fun(List<Long> list, TreeNode node, int k) {
if (node == null) {
return;
}
if (k >= list.size()) {
list.add((long) node.val);
} else {
list.set(k, list.get(k) + node.val);
}
fun(list, node.left, k + 1);
fun(list, node.right, k + 1);
}
最大或值
题目
思路
- leftOr 和 rightOr 数组:用于分别存储从左到右和从右到左的累积按位或结果。
- leftOr[i] 表示从数组开头到 i 的所有元素的按位或。
- rightOr[i] 表示从数组结尾到 i 的所有元素的按位或。
- 计算新的按位或:
- 对于每个元素 nums[i],它的左侧按位或结果是 left[i - 1],右侧按位或结果是 right[i + 1]。
- 然后将 nums[i] 乘以 2 的 k 次方,得到新的数 t。
- 将 left[i - 1]、t和 right[i + 1] 进行按位或,得到更新后的按位或结果。
- 最大化按位或结果:
- 对于每个元素进行操作后,更新最大的按位或结果。
代码
public long maximumOr(int[] nums, int k) {
if(nums.length==0){
return 0;
}
int[] left = new int[nums.length];
int[] right = new int[nums.length];
left[0]=nums[0];
for(int i=1;i< nums.length;i++){
left[i]=left[i-1]|nums[i];
}
right[nums.length - 1] = nums[nums.length - 1];
for (int i = nums.length- 2; i >= 0; i--) {
right[i] = right[i + 1] | nums[i];
}
long max = 0;
for (int i=0;i< nums.length;i++) {
long t = nums[i] * (1L << k);
long l = i > 0 ? left[i - 1] : 0;
long r = i < nums.length - 1 ? right[i + 1] : 0;
long cur = l|t|r;
max = Math.max(max, cur);
}
return max;
}
美丽下标对的数目
题目
思路
模拟,首先是双重遍历数组
每次遍历获取nums[i]的第一个数字,nums[j]的最后一个数字
判断是否互质,互质则sum++
代码
public int countBeautifulPairs(int[] nums) {
int sum = 0,n = nums.length;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
int a = nums[i];
while(a>10){
a=a/10;
}
int b = nums[j]%10;
if(gcd(a,b)){
sum++;
}
}
}
return sum;
}
private boolean gcd(int x,int y){
for(int i=2;i<=Math.min(x,y);i++){
if(x%i==0&&y%i==0){
return false;
}
}
return true;
}
移除字符串中的尾随零
题目
2710. 移除字符串中的尾随零 - 力扣(LeetCode)
思路
从尾部开始遍历字符串,遇到0就删除,遇到其他的直接跳出
代码
public String removeTrailingZeros(String num) {
int n = num.length();
StringBuilder sb = new StringBuilder(num);
for(int i=n-1;i>=0;i--){
if(num.charAt(i)=='0'){
sb.deleteCharAt(i);
}else{
break;
}
}
return sb.toString();
}