代码随想录刷题学习日记

仅为个人记录复盘学习历程,解题思路来自代码随想录

代码随想录刷题笔记总结网址:
代码随想录

56. 合并区间

给出一个区间的集合,合并所有重叠的区间。

关键思路:

还是寻找重叠的区间,知识操作不同,

1.对整个数组进行排序,按左边界排序

2.由左到右遍历排序后的数组(因为按左边界排序),定义start为上一个合并区间的左边界,end为上一个合并区间的右边界:

2.1如果遍历到非重叠区间

将上一个区间加入到结果集中,

更新sart,

更新end,

2.2如果遍历到重叠区间

更新end(右边界)为上一合并区间和当前区间更大的那个

代码大致如下:

    public int[][] merge(int[][] intervals) {

        //初始化
        Arrays.sort(intervals,(a,b)->a[0]-b[0]);
        Listres=new ArrayList<>();
        int start=intervals[0][0];
        int end=intervals[0][1];

        //开始合并
        for(int i=1;iend){
                int[] temp={start,end};
                res.add(temp);
                start=intervals[i][0];
                end=intervals[i][1];
            }
            else{

                //如果重叠,更新右边界
                end=Math.max(end,intervals[i][1]);
            }

        }

         //每次加入都是加入上一个区间,最后剩余一个区间未加入
        int[] temp={start,end};
        res.add(temp);

        return res.toArray(new int[res.size()][]);

    }

738.单调递增的数字

给定一个非负整数 N,找出小于或等于 N 且满足其各个位数上的数字是单调递增的最大整数。

关键思路:

贪心思想:当从个位向前遍历(各个位数满足单调递增)时,每当不满足递增时,将前面位的数字减1,将后面所有位的数字改为9,如98,89;213,199

代码大致如下:

    public int monotoneIncreasingDigits(int n) {

        //初始化,将strings转化为字符串数组,定义最开始变成9的起点
        String[] strings=(n+"").split("");
        int point=strings.length;

        //开始从后向前遍历字符串数组
        for(int i=strings.length-1;i>0;i--){

            //如果不单调递增,前面位数字-1,point向前移动
            if(Integer.parseInt(strings[i])

968.监控二叉树

给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。

关键思路:

如果把摄像头放在叶子节点上,就浪费的一层的覆盖,把摄像头放在叶子节点的父节点位置,才能充分利用摄像头的覆盖面积。

为什么不从头结点开始呢?

在二叉树中每层的节点数将会指数级增长,头节点仅有一个,但叶节点是指数级别的

贪心思想:从叶节点的父节点开始放置摄像头,最大程度减少需要的摄像头

如何从叶节点的父节点开始遍历二叉树防止摄像头?

自底向上遍历二叉树,采用后续遍历

判断每个节点有哪些状态:

0:本节点无摄像头覆盖

1:本节点有摄像头

2:本节点被摄像头覆盖

以上是二叉树节点可能会出现的状态

遍历二叉树中遇到空节点时,返回值为何?(终止条件)

从叶节点开始分析,如果空节点是状态0(无摄像头覆盖),则叶节点需要安装摄像头;

如果空节点是状态1(有摄像头),则叶节点的父节点不需要安装摄像头;

所以空节点应该返回状态2

单层处理逻辑:

1.左右子节点都有覆盖,则该节点无覆盖

2.左右子节点至少有一个节点无覆盖,则该节点应当添加摄像头

3.左右子节点至少有一个有摄像头,则该节点有覆盖

4.遍历结束头节点可能处于状态0,需要给它加上摄像头

代码大致如下:

    private int res=0;
    
    public int minCameraCover(TreeNode root) {

        //初始化
        //int res=0;
        
        //判断如果头节点为0,res++
        if(traversal(root)==0) res++;
        
        return res;
    }
    public int traversal(TreeNode root){

        //如果是空节点
        if(root==null)return 2;

        //左子节点处理逻辑
        int left=traversal(root.left);

        //右子节点处理逻辑
        int right=traversal(root.right);

        //单层处理逻辑
        if(left==2&&right==2){return 0;}
        else if(left==0||right==0){res++;return 1;}
        else {return 2;}
    }

你可能感兴趣的:(代码随想录学习日记,学习,算法,贪心算法,leetcode,java)