用双哈希解决该问题

设计LRU缓存结构

http://www.nowcoder.com/questionTerminal/e3769a5f49894d49b871c09cadd13a61

import java.util.*;


public class Solution {
    /**
     * lru design
     * @param operators int整型二维数组 the ops
     * @param k int整型 the k
     * @return int整型一维数组
     */
  public int[] LRU (int[][] operators, int k) {
        // write code here
        Map<Integer,Integer> tempMap1 = new HashMap<Integer, Integer>();//存储key与value
        Map<Integer,Integer> tempMap2 = new HashMap<Integer, Integer>();//存储优先级
        ArrayList<Integer> array = new ArrayList<Integer>();

        for(int i = 0;i<operators.length;i++){
            if(operators[i][0]==1){
                tempMap1.put(operators[i][1],operators[i][2]);//存储key与对应的value
                tempMap2.put(operators[i][1],getMaxPriority(tempMap2)+1);//存储存贮key,然后赋值优先级,每次访问的时候,设置给当前最大优先级+1
                if(tempMap1.size()>k){
                    tempMap1.remove(getMin(tempMap2));//得到优先级最小的key并且删除
                }
            }if (operators[i][0]==2){
                tempMap2.put(operators[i][1],getMaxPriority(tempMap2)+1);//优先级在最大的基础上进行+1
                array.add(tempMap1.getOrDefault(operators[i][1],-1));//得到key所对应的value,如果不在就返回-1;


            }
        }

        int a[] = new int[array.size()];
        int index = 0;
        for(int num :array){
            a[index] = num;
            ++index;
        }
        return a;




    }

    public int getMaxPriority(Map<Integer, Integer> tempMap2) {
        if(tempMap2.size()==0){
            return 0;
        }
        int value = Integer.MIN_VALUE;
        for(int key :tempMap2.keySet()){
            if(tempMap2.get(key)>value){
                value = tempMap2.get(key);
            }
        }
        return value;


    }

    public  int getMin(Map<Integer,Integer> tempMap2){
        int value = Integer.MAX_VALUE ;int keyOfMin=0;
        for(int key :tempMap2.keySet()){
            if(tempMap2.get(key)<value){
                value = tempMap2.get(key);
                keyOfMin = key;
            }
        }

        return keyOfMin;



    }
}

tempMap1存储原来的key以及所对应的value,tempMap2存储key以及所对应的优先级。
1:对operators数组进行遍历,然后对tempMap1与tempMap2进行赋值初始化
/*注:我这里的设置优先级是每次访问一个key的时候最原本的tempMap2所对应的虽大优先级进行+1*/
2:在对tempMap1初始化后,如果operators[i][0]为1的时候我们这个时候需要去判断tempMap1的size(),如果此时大于k的话我们则需要对tempMap2的最小value进行查找,
然后返回最小value所对应的key,然后tempMap1根据key将Map里面存储的数据进行删除
3:operators[i][0]为2的时候,我们首先对tempMap1中key为operators[i][1]的优先级进行+1,然后在tempMap1中查找相关key对应的value,将其放如果到ArrayList中去
最后将ArrayList遍历放到数组中,将数组返回。
4最后时间复杂度o(n),空间复杂度o(n2);
 
  
 
全部评论

相关推荐

10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
11-08 13:58
门头沟学院 Java
程序员小白条:竟然是蓝桥杯人才doge,还要花钱申领的offer,这么好的公司哪里去找
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务