当前位置: 首页 > article >正文

【二刷hot-100】day 3

目录

1.最小覆盖子串

2.二叉树展开为链表

3.面试题 17.14. 最小K个数

1.最小覆盖子串

 

class Solution {
    public String minWindow(String s, String t) {
           char [] s1=s.toCharArray();
           int m=s1.length;
           int retleft=-1;
           int retright=m;
           int [] cnts=new int[128];
           int [] cntt=new int[128];
           for(char c: t.toCharArray()){
             cntt[c]++;
           }

           int left=0;
           for(int right=0;right<m;right++){
            cnts[s1[right]]++;
            while(isCovered(cnts,cntt)){
                if(right-left<retright-retleft){
                    retleft=left;
                    retright=right;
                }
                cnts[s1[left]]--;
                left++;
            }
           }
           return retleft<0?"":s.substring(retleft,retright+1);
    }

    private boolean isCovered(int [] cnts,int [] cntt ){
        for(int i='A';i<='Z';i++){
            if(cnts[i]<cntt[i]){
                return false;
            }
        }

        for(int i='a';i<='z';i++){
            if(cnts[i]<cntt[i]){
                return false;
            }
        }
        return true;
    }
}

2.二叉树展开为链表

先序遍历的写法。

 就是找出左子树最右边的节点以便把右子树接过来。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public void flatten(TreeNode root) {
         while(root!=null){
             //如果左子树为null,直接考虑下一个节点
             if(root.left==null){
                root=root.right;
             }else{
                //查找左子树的最右节点
                TreeNode pre=root.left;
                while(pre.right!=null){
                    pre=pre.right;
                }
                //拼接右子树
                pre.right=root.right;
                //root的右子树换上左子树
                root.right=root.left;
                //root的左子树置空
                root.left=null;
                //下一个节点
                root=root.right;
             }
         }
    }
}

3.面试题 17.14. 最小K个数

可以直接sort然后输出,但时间复杂度较高。

 

 

class Solution {
    public int[] smallestK(int[] arr, int k) {
        //升序的优先队列,小根堆排序
        PriorityQueue<Integer> q=new PriorityQueue<>((a,b)->a-b);
        for (int i:arr) q.add(i);
        int [] ret=new int[k];
        for(int i=0;i<k;i++) ret[i]=q.poll();
        return ret;
    }
}

ps: 

升序的优先队列。


http://www.kler.cn/news/356892.html

相关文章:

  • Python中的SQLAlchemy:解锁数据库操作的新世界
  • 8年测试工程师 —— 如何使用Playwright优化测试性能!
  • 一起搭WPF架构之livechart的MVVM使用介绍
  • VTK的学习方法-第二类型应用
  • 【Git】常用Git命令
  • OpenCV高级图形用户界面(9)更改指定窗口的位置函数moveWindow()的使用
  • 如何安装MySql
  • 计算机毕业设计 零食批发商仓库管理系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 阿里dataworks数据集成同步Mongodb数据到阿里
  • 电脑基础知识:mfc110.dll丢失的解决方法
  • 【p2p、分布式,区块链笔记 Blockchain】truffle001 以太坊开发框架truffle初步实践
  • 华为OD机试真题---货币单位换算
  • 单独配置LVS负载均衡服务器+web
  • C#学习笔记(四)
  • TCP/IP传输协议,易懂!!!
  • PHP(一)从入门到放弃
  • 速盾:cdn 速度取决于什么?
  • 【H2O2|全栈】关于CSS(14)如何完成常规的页面布局
  • 简单实现通过电脑操作手机
  • 【优选算法】探索双指针之美(一):双指针与单调性的完美邂逅