首页 > 其他分享 >2022-8-22 剑指offer-优先队列-每日一题-二叉树-搜索/递归

2022-8-22 剑指offer-优先队列-每日一题-二叉树-搜索/递归

时间:2022-08-22 10:56:33浏览次数:92  
标签:TreeNode val 22 offer int res 矩阵 二叉树 new

剑指 Offer II 060. 出现频率最高的 k 个数字

难度中等

给定一个整数数组 nums 和一个整数 k ,请返回其中出现频率前 k 高的元素。可以按 任意顺序 返回答案。

 1 class Solution {
 2     public int[] topKFrequent(int[] nums, int k) {
 3         Map<Integer,Integer> map=new HashMap<>();
 4         for (int x:nums){
 5             map.put(x,map.getOrDefault(x,0)+1);
 6         }
 7         PriorityQueue<Pair> q=new PriorityQueue<>(
 8                 (a,b)->(b.fre-a.fre)
 9         );
10         for (Map.Entry<Integer, Integer> e : map.entrySet()) {
11             q.offer(new Pair(e.getKey(),e.getValue()));
12         }
13         int[] ans=new int[k];
14         for (int i=0;i<k;i++){
15             ans[i]=q.poll().num;
16         }
17         return ans;
18     }
19 
20 
21 }
22 class Pair{
23     int num;
24     int fre;
25     Pair(int n,int f){
26         num=n;
27         fre=f;
28     }
29 }

思路:遍历一遍,得到统计次数,再用优先队列排序,输出。

655. 输出二叉树

难度中等

给你一棵二叉树的根节点 root ,请你构造一个下标从 0 开始、大小为 m x n 的字符串矩阵 res ,用以表示树的 格式化布局 。构造此格式化布局矩阵需要遵循以下规则:

  • 树的 高度 为 height ,矩阵的行数 m 应该等于 height + 1 。
  • 矩阵的列数 n 应该等于 2height+1 - 1 。
  • 根节点 需要放置在 顶行 的 正中间 ,对应位置为 res[0][(n-1)/2] 。
  • 对于放置在矩阵中的每个节点,设对应位置为 res[r][c] ,将其左子节点放置在 res[r+1][c-2height-r-1] ,右子节点放置在 res[r+1][c+2height-r-1] 。
  • 继续这一过程,直到树中的所有节点都妥善放置。
  • 任意空单元格都应该包含空字符串 "" 。

返回构造得到的矩阵 res 。

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode() {}
 8  *     TreeNode(int val) { this.val = val; }
 9  *     TreeNode(int val, TreeNode left, TreeNode right) {
10  *         this.val = val;
11  *         this.left = left;
12  *         this.right = right;
13  *     }
14  * }
15  */
16 class Solution {
17     public List<List<String>> printTree(TreeNode root) {
18         int height=getHeight(root);
19         int[][] arr=new int[height][(1<<height)-1];
20         //System.out.println((1<<height)-2);
21         for (int i=0;i<height;i++){
22             Arrays.fill(arr[i],-100);
23         }
24         Queue<Pair> q=new LinkedList<>();
25         q.offer(new Pair(root,((1<<height)-2)/2));
26         arr[0][((1<<height)-2)/2]=root.val;
27 
28         int h=1;
29         while (!q.isEmpty()){
30             int len=q.size();
31             for (int i=0;i<len;i++){
32                 Pair pair=q.poll();
33                 TreeNode node=pair.tree;
34                 if (node.left!=null) {
35                     
36                     arr[h][pair.pos-(1<<(height-h-1))]=node.left.val;
37                     
38                     q.offer(new Pair(node.left,pair.pos-(1<<(height-h-1))));
39                 }
40                 if (node.right!=null) {
41                     System.out.println(pair.pos+(1<<(height-h-1)));
42                     arr[h][pair.pos+(1<<(height-h-1))]=node.right.val;
43                     q.offer(new Pair(node.right,pair.pos+(1<<(height-h-1))));
44                 }
45             }
46             h++;
47         }
48         List<List<String>> ans=new ArrayList<>();
49         for (int i=0;i<height;i++){
50             List<String> l=new ArrayList<>();
51             for (int j=0;j<(1<<height)-1;j++){
52                 if (arr[i][j]==-100) l.add("");
53                 else l.add(String.valueOf(arr[i][j]));
54             }
55             ans.add(l);
56         }
57         return ans;
58     }
59 
60 
61 
62     public int getHeight(TreeNode root){
63         if (root==null) return 0;
64         return Math.max(getHeight(root.left),getHeight(root.right))+1;
65     }
66 }
67 
68 class Pair{
69     TreeNode tree;
70     int pos;
71     Pair(TreeNode t,int p){
72         tree=t;
73         pos=p;
74     }
75 }

思路:广度优先搜索,层序遍历。注意可以不开通arr数组,因为list也支持指定位置插入。

 

标签:TreeNode,val,22,offer,int,res,矩阵,二叉树,new
From: https://www.cnblogs.com/benbicao/p/16612085.html

相关文章

  • 220. 存在重复元素 III
     思路难度中等645收藏分享切换为英文接收动态反馈给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i......
  • 算法---二叉树的前序遍历
    知识点树递归dfs广度优先搜索(BFS)描述给你二叉树的根节点root,返回它节点值的前序遍历。数据范围:二叉树的节点数量满足0≤n≤100 0\len\le100\0≤......
  • 2022-08-21 第六小组 高佳誉 学习笔记
    1.JDBC是什么?JavaDataBaseConnectivity(Java语言连接数据库)2.JDBC的本质是什么?JDBC是SUN公司制定的一套接口(interface)java.sql.*;(这个软件包下有很多接口)接口都有调......
  • Linq-20220817更新
    一、常用函数Where:每一项数据都会经过predicate(传入的委托lambda表达式)的测试,如果对元素执行predicate后返回值为True,则这个元素会添加到结果数组中Count:每一项数据都......
  • 平衡二叉树
    1.为什么需要平衡二叉树?二叉排序树可能的存在的问题给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST),并分析问题所在.上图BST存在的问题分析:左子树全部为......
  • 老梗新玩「GitHub 热点速览 v.22.34」
    作者:HelloGitHub-小鱼干不知道你是否和我有一样的烦恼,最近的流行梗当自己要用拿来造词时,就陷入了不知道咋“换壳”的尴尬地步。sao-gen-gen大大减少了你老梗新用的脑力......
  • 655. 输出二叉树
    655.输出二叉树给你一棵二叉树的根节点root,请你构造一个下标从0开始、大小为mxn的字符串矩阵res,用以表示树的格式化布局。构造此格式化布局矩阵需要遵循......
  • 2022.8.21 摆烂记录
    Preface回归Content[luoguP4310]绝世好题给定序列\(a_{1\simn}\),求子序列\(b\)的最长长度\(k\),使得\(\foralli\in[2,k],b_i\mathsf{\&}b_{i-1}\gt0\)。\(......
  • 2022.8.21 CAS与原子引用(解决CAS的ABA问题)
    19、深入理解CAS什么是CAS packagecom.xing.cas; ​ importjava.util.concurrent.atomic.AtomicInteger; //原子类的底层用的cas publicclassCASDemo{  ......
  • 2022.8.21 各种锁理解
    21、各种锁理解1、公平锁和非公平锁:公平锁:非常公平,不能够插队,必须先来后到!FIFO非公平锁:非常不公平,可以插队(默认都是非公平)2、可重入锁递归锁  可重入锁sync......