56. 合并区间
使用一个循环遍历所有区间。如果res
为空,或者当前区间的起始位置大于res
中最后一个区间的结束位置,则将当前区间添加到res
中。否则,更新res
中最后一个区间的结束位置为当前区间的结束位置和res
中最后一个区间的结束位置的较大值。
public class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> res = new LinkedList<>();
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
for (int[] interval : intervals) {
if (res.isEmpty() || interval[0] > res.get(res.size() - 1)[1]) res.add(interval);
else res.get(res.size() - 1)[1] = Math.max(res.get(res.size() - 1)[1], interval[1]);
}
return res.toArray(new int[res.size()][]);
}
}
738.单调递增的数字
贪心算法从倒数第二位开始向前遍历字符串,如果发现当前字符大于下一位字符,则将当前字符减一,并记录需要调整的起始位置start
为当前位置加1。然后,从start
位置开始,将后面的所有字符都置为字符'9',以确保满足单调递增的条件。
算法题里面将字符串转换为字符数组char[]大幅优化
class Solution {
public int monotoneIncreasingDigits(int n) {
String s = String.valueOf(n);
char[] chars = s.toCharArray();
int start = s.length();
for (int i = s.length() - 2; i >= 0; i--) {
if (chars[i] > chars[i + 1]) {
chars[i]--;
start = i+1;
}
}
for (int i = start; i < s.length(); i++) {
chars[i] = '9';
}
return Integer.parseInt(String.valueOf(chars));
}
}
968.监控二叉树
本质上还是二叉树的递归,使用后序遍历的方式处理二叉树的节点。对于每个节点,根据左右子节点的状态来确定自己的状态。
class Solution {
int res=0;
public int minCameraCover(TreeNode root) {
if(minCame(root)==0){
res++;
}
return res;
}
public int minCame(TreeNode root){
if(root==null){
return 2;
}
int left=minCame(root.left);
int right=minCame(root.right);
if(left==2&&right==2){
return 0;
}else if(left==0||right==0){
res++;
return 1;
}else{
return 2;
}
}
}