代码随想录Day20

目录

1、45. 跳跃游戏 II

2、1005. K 次取反后最大化的数组和

3、134. 加油站

4、135. 分发糖果

5、860. 柠檬水找零

6、406. 根据身高重建队列

7、452. 用最少数量的箭引爆气球

8、435. 无重叠区间

9、763. 划分字母区间

10、56. 合并区间

11、738. 单调递增的数字

12、968. 监控二叉树

1、45. 跳跃游戏 II

有点难想

class Solution {
    public int jump(int[] nums) {
        if(nums.length == 1) return 0;
        int cur = 0;
        int next = 0;
        int res = 0;
        for(int i = 0; i < nums.length; ++i)
        {
            next = Math.max(next,i + nums[i]);
            if(cur == i)
            {
                ++res;
                cur = next;
                if(cur >= nums.length - 1) break;
            }
        }
        return res;
    }
}

2、1005. K 次取反后最大化的数组和

Arrays.stream(nums).sum()  求和

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        Arrays.sort(nums);
        for(int i = 0; i < nums.length && k > 0; ++i)
        {
            if(nums[i] <= 0)
            {
                nums[i] = -nums[i];
                --k;
            }    
            else
                break;      
        }
        if(k > 0 && k % 2 == 1)
        {
            Arrays.sort(nums);
            nums[0] = -nums[0];
        }
        return Arrays.stream(nums).sum();
    }
}

3、134. 加油站

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int res = 0;
        int cur = 0;
        for(int i = 0; i < gas.length; ++i)
        {
            cur = cur + gas[i] - cost[i];
            if (cur < 0)
            {
                cur = 0;
                res = i + 1;
            }
        }
        if(Arrays.stream(gas).sum() < Arrays.stream(cost).sum()) return -1;
        return res;
    }
}

4、135. 分发糖果

遍历两次,左右两边分开看

class Solution {
    public int candy(int[] ratings) {
        int[] candy = new int[ratings.length];
        Arrays.fill(candy,1);
        for(int i = 1; i < ratings.length; ++i)
        {
            if(ratings[i] > ratings[i - 1])
                candy[i] = candy[i - 1] + 1;
        }
        for(int i = ratings.length - 2; i >= 0; --i)
        {
            if(ratings[i] > ratings[i + 1])
                candy[i] = Math.max(candy[i + 1] + 1,candy[i]);
        }
        return Arrays.stream(candy).sum();
    }
}

5、860. 柠檬水找零

这题简单

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int[] money = new int[2];
        for(int i = 0; i < bills.length; ++i)
        {
            if(bills[i] == 5) money[0] += 1;
            if(bills[i] == 10)
            {
                if(money[0] > 0)
                {
                    --money[0];
                    ++money[1];
                }
                else return false;
            }
            if(bills[i] == 20)
            {
                if(money[0] > 0)
                {
                    if(money[1] > 0)
                    {
                        --money[1];
                        --money[0];
                    }
                    else
                    {
                        if(money[0] > 2)
                        {
                            money[0] -= 3;
                        }
                        else return false;
                    }
                }
                else return false;
            }
        }
        return true;
    }
}

6、406. 根据身高重建队列

先看一个维度,再看另一个维度

LinkedList变数组

que.toArray(new int[people.length][]);
class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people,(a,b) -> {if(a[0] == b[0]) return a[1] - b[1]; return b[0] - a[0];});
        LinkedList<int[]> que = new LinkedList<>();
        for(int[] p : people)
        {
            que.add(p[1],p);
        }
        return que.toArray(new int[people.length][]);
    }
}

7、452. 用最少数量的箭引爆气球

使用Integer内置比较方法,不会溢出

class Solution {
    public int findMinArrowShots(int[][] points) {
        Arrays.sort(points,(a,b)->Integer.compare(a[0], b[0]));
        int l = points[0][0], r = points[0][1];
        int res = 1;
        for(int i = 1; i < points.length; ++i)
        {
            if(points[i][0] >= l && points[i][0] <= r)
            {
                l = points[i][0];
                r = Math.min(points[i][1],r);
            }
            else
            {
                l = points[i][0];
                r = points[i][1];
                ++res;
            }
        }
        return res;
    }
}

8、435. 无重叠区间

和上一题差不多

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals,(a,b)->Integer.compare(a[0], b[0]));
        int res = 0;
        for(int i = 1; i < intervals.length; ++i)
        {
            if(intervals[i][0] < intervals[i - 1][1])
            {
                intervals[i][1] = Math.min(intervals[i][1],intervals[i - 1][1]);
                ++res;
            }
        }
        return res;
    }
}

9、763. 划分字母区间

class Solution {
    public List<Integer> partitionLabels(String s) {
        int[] record = new int[26];
        Arrays.fill(record,-1);
        List<Integer> res = new LinkedList<>();
        for(int i = 0; i < s.length(); ++i)
        {
            record[s.charAt(i) - 'a'] = i;
        }
        int tmpIndex = -1;
        int rBorder = record[s.charAt(0) - 'a'];
        for(int i = 0; i < s.length(); ++i)
        {   
            rBorder = Math.max(record[s.charAt(i) - 'a'], rBorder);
            if(i == rBorder)
            {
                res.add(rBorder - tmpIndex);
                tmpIndex = i;
            }
        }
        return res;
    }
}

10、56. 合并区间

和前面的差不多

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals,(a,b)->Integer.compare(a[0],b[0]));
        List<int[]> res = new LinkedList<>();
        int start = intervals[0][0];
        int end = intervals[0][1];
        for(int i = 0; i < intervals.length; ++i)
        {
            if(intervals[i][0] <= end)
            {
                end = Math.max(intervals[i][1],end);
            }
            else
            {
                res.add(new int[]{start,end});
                start = intervals[i][0];
                end = intervals[i][1];
            }
        }
        res.add(new int[]{start,end});
        return res.toArray(new int[res.size()][]);
    }
}

11、738. 单调递增的数字

从后往前看

class Solution {
    public int monotoneIncreasingDigits(int n) {
        String s = String.valueOf(n);
        char[] nums = s.toCharArray();
        if(nums.length == 1) return n;
        int start = nums.length;
        for(int i = nums.length - 1; i > 0 ; --i)
        {
            if(nums[i] < nums[i - 1])
            {
                --nums[i - 1];
                start = i;
            } 
        }
        for(int i = start; i < nums.length; ++i)
            nums[i] = '9';
        return Integer.parseInt(String.valueOf(nums));
    }
}

12、968. 监控二叉树

递归

class Solution {
    int res = 0;
    public int minCameraCover(TreeNode root) {
        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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值