Day28 | 53最大子数组和&134加油站&968监控二叉树

54 阅读1分钟

最大子数组和 LeetCode 53

题目链接:[LeetCode 53 - 中等]

思路

        maxSum = Math.max(curSum,maxSum);
        if(curSum<=0){
            curSum = 0;
        }

两者的顺序不能更换

贪心:

class Solution {
    public int maxSubArray(int[] nums) {
        int curSum = 0;
        int maxSum = Integer.MIN_VALUE;
        for(int i=0;i<nums.length;i++){
            curSum += nums[i];
            maxSum = Math.max(curSum,maxSum);
            if(curSum<=0){
                curSum = 0;
            }
        }
        return maxSum;
    }
}

加油站 LeetCode 134

题目链接:[LeetCode 134 - 中等]

思路

1.如何找到一个加油站的序号:result = (i+1)%gas.length; 2.如何判断是否存在解:if(totalSum<0)result=-1;

贪心:

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int result = 0;
        int curSum = 0;
        int totalSum = 0;
        for(int i=0;i<gas.length;i++){
            curSum += gas[i]-cost[i];
            totalSum += gas[i]-cost[i];
            if(curSum<0){
                result = (i+1)%gas.length;
                curSum = 0;Q
            }
        }
        if(totalSum<0)result=-1;
        return result;
    }
}

监控二叉树 LeetCode 968

题目链接:[LeetCode 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;
        }
    }
}