leetCode每日十题---堆(难度:困难)

题目描述1

在这里插入图片描述

笔者分析1.1

直到现在我还是会对这种类似于多决策问题产生畏惧,我总是会认为它很复杂,因为它有多种多样的走法,和判定条件。但每次看到题解,就又会惊叹于如此少量的代码就可以实现。因为单从代码来看,你是看不出来它是在写这题的,一个很大众很简洁的处理方式。不过看到这种类似多决策问题的题,递归就完事了。

class Solution {
    public int swimInWater(int[][] grid) {
         int N=grid.length;
         int ans=Math.max(grid[0][0],grid[N-1][N-1]);
         while(true){
         //从(0,0)开始挖地雷,数字变成ans+1,防止重复
          change(0, 0, N, grid, ans + 1);
          if (grid[N - 1][N - 1] == ans + 1) {
            return ans;
           }
           ans++;
         }
    }
    public static void change(int x,int y,int N,int[][] grid,int key)    {
        if(grid[x][y]>=key){
            return ;
        }
        grid[x][y] = key;
        if (x > 0) {
        change(x - 1, y, N, grid, key);
        }
        if (y > 0) {
        change(x, y - 1, N, grid, key);
        }
        if (x < N - 1) {
        change(x + 1, y, N, grid, key);
        }
         if (y < N - 1) {
        change(x, y + 1, N, grid, key);
        }
    }
}

题目描述2

在这里插入图片描述

笔者分析2

这个题目的意思已经算是很简单明了了的,但要想在线性复杂度求解出来,我还没想到,有想过用大顶堆,但卡在了一个问题上。就是当窗口右移的时候,如何弹出大顶堆内的元素。看了下题解,也有用大顶堆的,但弹出元素很巧妙,理解了好久。

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums==null||nums.length<2) return nums;
        // 双向队列 保存当前窗口最大值的数组位置 保证队列中数组位置的数按从大到小排序
        LinkedList<Integer> list = new LinkedList();
        // 结果数组
        int[] result = new int[nums.length-k+1];
        for(int i=0;i<nums.length;i++){
            // 保证从大到小 如果前面数小 弹出
            while(!list.isEmpty()&&nums[list.peekLast()]<=nums[i]){
                list.pollLast();
            }
            // 添加当前值对应的数组下标
            list.addLast(i);
            // 初始化窗口 等到窗口长度为k时 下次移动在删除过期数值
            if(list.peek()<=i-k){//这一步就是用来弹出元素的
                list.poll();   
            } 
            // 窗口长度为k时 再保存当前窗口中最大值
            if(i-k+1>=0){
                result[i-k+1] = nums[list.peek()];
            }
        }
        return result;
    }
}

总结

今天白天有个部门面试,困难的堆题是写不完了,写了几题简单的排序补补数量,每日十题打卡第八天,以下图为证
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路的苟狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值