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;
    }
}

总结

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

猜你喜欢

转载自blog.csdn.net/Achenming1314/article/details/108402883