Leetcoe高频题(四) 我就不信邪了 LeetCode堆相关


一、堆

215. 数组中的第K个最大元素

在这里插入图片描述

class Solution {
    
    
     public int findKthLargest(int[] nums, int k) {
    
    
        PriorityQueue<Integer> maxK=new PriorityQueue<>();
       
        for (int i = 0; i <nums.length ; i++) {
    
    
            if(i<k){
    
    
            maxK.add(nums[i]);
            }else if(maxK.peek()<nums[i]){
    
    
                maxK.poll();
                maxK.add(nums[i]);
            }

        } 
        return maxK.poll();
         
    } 
}

347. 前 K 个高频元素

在这里插入图片描述

class Solution {
    
    
    public int[] topKFrequent(int[] nums, int k) {
    
    
   
            // 使用字典,统计每个元素出现的次数,元素为键,元素出现的次数为值
        HashMap<Integer,Integer> map = new HashMap();
        for(int num : nums){
    
    
            if (map.containsKey(num)) {
    
    
               map.put(num, map.get(num) + 1);
             } else {
    
    
                map.put(num, 1);
             }
        }
        // 遍历map,用最小堆保存频率最大的k个元素
        PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {
    
    
            @Override
            public int compare(Integer a, Integer b) {
    
    
                return map.get(a) - map.get(b);
            }
        });
        for (Integer key : map.keySet()) {
    
    
            if (pq.size() < k) {
    
    
                pq.add(key);
            } else if (map.get(key) > map.get(pq.peek())) {
    
    
                pq.remove();
                pq.add(key);
            }
        }
 
   
        int a[]=new int[k];
        for (int i = 0; i <k ; i++) {
    
    
            a[i]=pq.poll() ;
        }
        return a;
    }
}

二、回溯法

2.1 二维平面回溯

54. 螺旋矩阵

在这里插入图片描述


class Solution {
    
    
    public List<Integer> spiralOrder(int[][] matrix) {
    
    
        ArrayList<Integer> res=new ArrayList<>();
          if(matrix==null||matrix.length==0) return res; 
        int left=0,right=matrix[0].length-1,up=0,down=matrix.length-1;
        
        
        while(left<=right&&up<=down){
    
    
            //从左到右
            for(int i=left;i<=right&&up<=down;i++){
    
    
                res.add(matrix[up][i]);
            }          
            up++;
            
            //从上到下
            for(int j=up;j<=down&&left<=right;j++){
    
    
                res.add(matrix[j][right]);
            }
            right--;
            
            //从右到左
            
            for(int i=right;i>=left&&up<=down;i--){
    
    
                res.add(matrix[down][i]);
            }
            down--;
            
            //从下到上
            for(int j=down;j>=up&&left<=right;j--){
    
    
                res.add(matrix[j][left]);
            }
            left++; 
        } 
        return res;
    }
}

剑指 Offer 12. 矩阵中的路径

在这里插入图片描述

class Solution {
    
    
    
 public boolean exist(char[][] board, String word) {
    
    
        char[] words = word.toCharArray();
        for(int i = 0; i < board.length; i++) {
    
    
            for(int j = 0; j < board[0].length; j++) {
    
    
                if(dfs(board, words, i, j, 0)) return true;
            }
        }
        return false;
    }
    boolean dfs(char[][] board, char[] word, int i, int j, int k) {
    
    
        if(i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] != word[k]) return false;
        if(k == word.length - 1) return true;
        char tmp = board[i][j];
        board[i][j] = '/';
        boolean res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) || 
                      dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i , j - 1, k + 1);
        board[i][j] = tmp;
        return res;
    }
 }

剑指 Offer 13. 机器人的运动范围

在这里插入图片描述

class Solution {
    
    
//原来是求能走到的所有格子之和.简单的BFS,每加一个合法的坐标, res += 1.
         int count=0;
    public int movingCount(int m, int n, int k) {
    
    
      
       boolean[][] visited=new boolean[m][n]; 
        return  recur(0,0,m,n,k,visited); 
    }


     public int recur(int i,int j,int m,int n,int k, boolean visited[][]){
    
    
             
         //当在方格范围外面或者已经访问过或者方格之和大于18,则为0
     if(i<0||i>=m||j<0||j>=n||(i/10+i%10+j/10+j%10)>k||visited[i][j]==true){
    
    
              return 0;
     } 
          count+=1;
          visited[i][j] = true;
           recur(i+1,j,m,n,k,visited);
           recur(i-1,j,m,n,k,visited);
           recur(i,j-1,m,n,k,visited);
           recur(i,j+1,m,n,k,visited);
           return count;
     }  


}

200. 岛屿数量

在这里插入图片描述

class Solution {
    
    
    
            int count=0;
         public int numIslands(char[][] grid) {
    
    
              for(int i=0;i<grid.length;i++){
    
    
                 for(int j=0;j<grid[0].length;j++){
    
    
                     if(grid[i][j]=='1'){
    
    
                     count++;
                     infect(grid,i,j); 
                     }
                 }
              } 
              return count;
     }

         public void infect(char[][] grid,int i,int j){
    
    
            if(i<0||j<0||i>=grid.length||j>=grid[0].length||grid[i][j]!='1') return;
            grid[i][j]='2';
            infect(grid,i+1,j);
            infect(grid,i,j+1);
            infect(grid,i-1,j);
            infect(grid,i,j-1);  
         }

    
}

2.2 排列组合

78. 子集

在这里插入图片描述

class Solution {
    
    
    public List<List<Integer>> subsets(int[] nums) {
    
    
            List<List<Integer>> res=new ArrayList<>();
            res.add(new  ArrayList<>());

           for(int i=0;i<nums.length;i++){
    
    
                int n=res.size();
                for(int j=0;j<n;j++){
    
    
                List<Integer> list=new ArrayList<>(res.get(j));
                 if (i >0 && nums[i] == nums[i - 1]) {
    
    
                      continue;
                }
                list.add(nums[i]);
                res.add(list);
                }
           } 
           return res;
    }
}

46. 全排列

在这里插入图片描述

77. 组合

给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38847154/article/details/108819731