首页 > 编程语言 >算法--2023.1.16

算法--2023.1.16

时间:2023-01-17 14:34:10浏览次数:47  
标签:head return 16 -- reverseHead next int 2023.1 public

1.实现Trie

class Trie {
    public int[][] edges;
    public int cnt;
    public boolean[] child; 
    public Trie() {
        //edges用来存节点的边
        edges = new int[300010][26];
        //cnt用来记录当前新建节点的编号
        cnt = 1;
        //child用来记录这个节点是否是根结点
        child = new boolean[300010];
    }
    
    public void insert(String word) {
        //插入逻辑:先遍历字典树
        int t = 0;
        for(int i = 0;i<word.length();i++){
            int k = word.charAt(i) - 'a';
            //如果字典树中存在,则继续向下遍历
            if(edges[t][k]!=0){
                t = edges[t][k];
            }else{
                //如果不存在则新建节点
                edges[t][k] = cnt;
                cnt++;
                t = edges[t][k];
            }
        }
        child[t] = true;

    }
    
    public boolean search(String word) {
        //查询逻辑:如果查询到当前节点,他的叶子节点不存在则直接返回
        int t = 0, i = 0;
        for(;i<word.length();i++){
            int k = word.charAt(i) - 'a'; 
            if(edges[t][k]!=0){
                t = edges[t][k];
            }else{
                return false;
            }
        }
        //System.out.println(t);
        //这里需要不断最后这个节点是否是child节点
        return child[t];

    }
    
    public boolean startsWith(String prefix) {
        int t = 0, i = 0;
        for(;i<prefix.length();i++){
            int k = prefix.charAt(i) - 'a'; 
            if(edges[t][k]!=0){
                t = edges[t][k];
            }else{
                return false;
            }
        }
        //这里需要判断
        return true;

    }
}

2.力扣215--数组中的第k个最大元素

class Solution {
    //快排找低k大的数
    public int[] nums1;
    public int findKthLargest(int[] nums, int k) {
        int n = nums.length;
        nums1 = new int[n];
        for(int i = 0;i<n;i++){
            nums1[i] = nums[i];
        }
        return quickSostKth(0,n-1,k);
    }
    public int quickSostKth(int left, int right, int k){
        if(left>=right){
            return nums1[left];
        }
        int l = left-1, r = right+1;
        int mid = nums1[(l+r)/2];
        while(l<r){
            do l++; while(l<r&&nums1[l]>mid);
            do r--; while(l<r&&nums1[r]<mid);
            if(l<r){
                int temp = nums1[l];
                nums1[l] = nums1[r];
                nums1[r] = temp;
            }
        }
        if((r-left+1)>=k){
            return quickSostKth(left,r,k);
        }
        return quickSostKth(r+1,right,k-(r-left+1));
    }
    
}

3.力扣221--最大正方形

class Solution {
    public int maximalSquare(char[][] matrix) {
        //dp[i][j]:代表以i,j为右下角的全是1的正方形的边长
        int m = matrix.length, n = matrix[0].length;
        int[][] dp = new int[m+1][n+1];
        for(int i = 0;i<=n;i++){
            dp[0][i] = 0;
        }
        for(int i = 0;i<=m;i++){
            dp[i][0] = 0;
        }
        int res = 0;
        for(int i = 1;i<=m;i++){
            for(int j = 1;j<=n;j++){
                if(matrix[i-1][j-1] == '1'){
                    //这个状态转移我还没有想清楚
                    dp[i][j] = Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1]) + 1;
                    res = Math.max(res,dp[i][j]);
                }
            }
        }
        return res*res;
    }
}

4.力扣226--翻转二叉树

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root == null){
            return root;
        }
        TreeNode left = invertTree(root.left);
        TreeNode right = invertTree(root.right);
        root.left = right;
        root.right = left;
        return root;
    }
}

5.力扣234--回文链表

class Solution {
    public ListNode reverse(ListNode head){
        ListNode t = null;
        while(head!=null){
            ListNode cur = head.next;
            head.next = t;
            t = head;
            head = cur;
        }
        return t;
    }
    public boolean isPalindrome(ListNode head) {
        ListNode p = head,t = head;
        int cnt = 0;
        while(t!=null){
            t = t.next;
            cnt++;
        }
        if(cnt == 1){
            return true;
        }
        if(cnt%2 == 0){
            int k = cnt/2;
            while(k!=1){
                p = p.next;
                k--;
            }
            ListNode q = p.next;
            p.next = null;
            ListNode reverseHead = reverse(q);
            while(head!=null&&reverseHead!=null){
                if(head.val!=reverseHead.val){
                    return false;
                }
                head = head.next;
                reverseHead = reverseHead.next;
            }
        }else{
            int k = cnt/2;
            while(k!=1){
                p = p.next;
                k--;
            }
            ListNode q = p.next.next;
            p.next = null;
            ListNode reverseHead = reverse(q);
            while(head!=null&&reverseHead!=null){
                if(head.val!=reverseHead.val){
                    return false;
                }
                head = head.next;
                reverseHead = reverseHead.next;
            }
        }
        return true;
    }
}

  

 

  

  

标签:head,return,16,--,reverseHead,next,int,2023.1,public
From: https://www.cnblogs.com/lyjps/p/17057733.html

相关文章

  • 小满nestjs(第四章 前置知识装饰器-实现一个GET请求)
    安装依赖npminstallaxios-S定义控制器 ControllerclassController{constructor(){}getList(){}}定义装饰器这时候需要使用装饰器工厂应为装饰器......
  • umi3.5新特性之提速方案mfsu
    umi版本要求:3.5+什么是mfsumfsu是一种基于webpack5新特性ModuleFederation的打包提速方案。核心原理是将应用的依赖构建为一个ModuleFederation的remote应用......
  • 文件上传测试:Windows 创建指定大小的文件
    读者提问: 『我们测试文件上传时需要上传指定大小的文件,Windows如何创建指定大小的文件,有比较便捷的操作方法吗 ?』 阿常回答: fsutil.exe 创建指定大小文件......
  • 小满nestjs(第六章 nestjs cli 常用命令)nest --help 可以查看nestjs所有的命令
    nest--help可以查看nestjs所有的命令他的命令和angular很像 案例生成一个用户模块1.生成controller.tsnestgcouser2.生成  module.tsnestgmouser3.生成service.t......
  • Docker 部署 Grafana
    请参考 Docker部署Prometheus 参考准备工作1.下载镜像dockerpullgrafana/grafana2.部署1.准备相关映射目录mkdir-p/mnt/docker/grafana/storagemkdir......
  • 小满nestjs(第二章 IOC控制反转 DI依赖注入)
    在学习nestjs之前需要先了解其设计模式IOCInversionofControl字面意思是控制反转,具体定义是高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该......
  • 【重磅】4 款超好用的在线视频转GIF神器推荐!!
    读者提问: 『阿常你好,在线视频转Gif工具有推荐的不 ?』 阿常回答: 这4款在线视频转GIF工具,简单好用,快来试一试! 蜜蜂剪辑-在线视频转换成GifImg2Go-在......
  • 小满nestjs(第三章 前置知识装饰器)
    1、什么是装饰器装饰器是一种特殊的类型声明,他可以附加在类,方法,属性,参数上面装饰器写法tips(需要开启一项配置)类装饰器主要是通过@符号添加装饰器他会自动把class的构造函......
  • 小满Vue3第三十八章(函数式编程,h函数)
    之前跟大家介绍了两种vue编写风格分别是template模板方式,和JSX方式感觉JSX被大家吐槽的很厉害,其实用习惯还挺好用的今天介绍第三种函数式编程主要会用到h函数​​h​​ 接......
  • Vue3 (Vscode插件)
    前端开发的编辑器有很多种如DW,hubilder,WebStorm,sublime,vscode,等等。​​Vue3+vite+Ts+pinia+实战+源码+全栈_哔哩哔哩_bilibili​​ 视频教程随着VsCode开......