面试经典150题(59-61)

作者分享了在LeetCode刷题过程中完成的第59、60、61题,涉及LRU缓存数据结构实现、二叉树最大深度计算和判断两棵树是否相同的算法。重点强调了LRU缓存的重要性,以及不同问题的解法和时间复杂度优化。
摘要由CSDN通过智能技术生成

leetcode 150道题 计划花两个月时候刷完,今天(第二十九天)完成了3道(59-61)150:

59.(146. LRU 缓存)题目描述:

请你设计并实现一个满足  LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。
函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

第一版(这个是个很经典的面试题,真的我之前就遇到过,但是今天还是忘了,用不是 o(1)的法子写了,我想到了Map和链表,但是没想到LinkedHashMap,就不放我这shit代码了,放一下最终版)

class LRUCache {
    Map<Integer,Integer> map;
    int size;
    public LRUCache(int capacity) {
        size=capacity;
        map=new LinkedHashMap<Integer,Integer>();
    }
    
    public int get(int key) {
        Integer value=map.get(key);
        if(value!=null){
            map.remove(key);
            map.put(key,value);
            return value.intValue();
        }
        return -1;
    }
    
    public void put(int key, int value) {
        if(map.containsKey(key)){
            map.remove(key);
            map.put(key,value);
            return ;
        }
        if(map.size()>=size){
        //LinkedHashMap 里面有一个双向链表,真的建议去看看怎么实现LRU,面试必有!
           Integer oldestKey = map.keySet().iterator().next();
           map.remove(oldestKey);
        }
        map.put(key,value);

    }
}

60.(104. 二叉树的最大深度)题目描述:

给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

第一版(直接递归)

class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null){
            return 0;
        }
        int left=maxDepth(root.left);
        int right=maxDepth(root.right);
        return Math.max(left,right)+1;
    }
    
}

第二版(层次遍历,有一层高度就加一)

class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null)
            return 0;
        //非递归
        int maxLen=0;
        Queue<TreeNode> queue=new LinkedList();
        queue.offer(root);
        while(!queue.isEmpty()){
           int currNum=queue.size();
           while(currNum!=0){
              TreeNode temp =queue.poll();
              if(temp.left!=null){
                  queue.offer(temp.left);
              }
              if(temp.right!=null){
                  queue.offer(temp.right);
              }
              currNum--;
           }
           maxLen++;
        }
        return maxLen;
    }
}

61.(100. 相同的树)题目描述:

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

第一版(直接递归,这个没搞遍历。。)

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p==null&&q==null){
            return true;
        }
        if(p!=null&&q!=null&&p.val==q.val){
            return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
        }
        return false;
    }
}

今天收获应该就是LRU吧。这个真的很重要,实现我感觉理解不了都要背下来。。。

第二十九天了,前几天人家放假我感冒发烧,今天到了上班时候我就好了,天选打工人。。

加油加油,早日跳槽!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值