【英雄算法六月集训】Day08

981. 基于时间的键值存储

设计一个基于时间的键值数据结构,该结构可以在不同时间戳存储对应同一个键的多个值,并针对特定时间戳检索键对应的值。

实现 TimeMap 类:

TimeMap() 初始化数据结构对象
void set(String key, String value, int timestamp) 存储键 key、值 value,以及给定的时间戳 timestamp。
String get(String key, int timestamp)
返回先前调用 set(key, value, timestamp_prev) 所存储的值,其中 timestamp_prev <= timestamp 。
如果有多个这样的值,则返回对应最大的 timestamp_prev 的那个值。
如果没有值,则返回空字符串(“”)。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/time-based-key-value-store
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这里JAVA的话 主要还是调用API 所以练习下API的使用 floorKey TreeMap的一些API

class TimeMap {

    /** Initialize your data structure here. */
    HashMap<String, TreeMap<Integer, String>> map;
    public TimeMap() {
        map = new HashMap();
    }
    
    public void set(String key, String value, int timestamp) {
        map.computeIfAbsent(key, k-> new TreeMap()).put(timestamp, value);
    }
    
    public String get(String key, int timestamp) {
        if(!map.containsKey(key)) {
            return "";
        }
        Integer time = map.get(key).floorKey(timestamp);
        if(time == null) {
            return "";
        }
        return map.get(key).get(time);
    }
}

400. 第 N 位数字

class Solution {
     public int findNthDigit(int n) {
        long ln = n, nine = 9;

        int i;
        for (i = 1; i <= 15; ++i) {
            ln -= nine * i;
            if (ln <= 0) {
                ln += nine * i;
                break;
            }
            nine *= 10;
        }

        long l = nine / 9;
        long r = l * 10 - 1;
        long ans = -1;
        while (l <= r) {
            long mid = (l + r) >> 1;
            long cnt = (mid - nine / 9 + 1) * i;
            if (cnt >= ln) {
                r = mid - 1;
                ans = mid;
            } else {
                l = mid + 1;
            }
        }
        Stack<Long> stack = new Stack<Long>();
        while (ans >= 1) {
            stack.push(ans % 10);
            ans /= 10;
        }
        Collections.reverse(stack);
        System.out.println(stack);
        Long aLong=new Long(0);
        if (stack.size() != 0) {

            aLong = stack.get((int) ((ln - 1) % i));
        }
        return aLong.intValue();
    }
}

1300. 转变数组后最接近目标值的数组和

class Solution {
    public int findBestValue(int[] arr, int target) {
         Arrays.sort(arr);
         int n =arr.length;
         int i,j;
         int sum=0;
         for(i=0;i<arr.length;++i){
             sum+=arr[i];
         }   
         int value = Math.abs(sum-target);
         int index = arr[n-1];
        

         //扫描线 从数组的后面向前扫描
         j=n-1;
         for(i=arr[n-1];i>=0;--i){
             while(j>=0&&arr[j]>i){
                --j;
             }
             sum-=(n-1-j);
             if(Math.abs(sum-target) <=value){
                 value = Math.abs(sum-target);
                 index = i;
             }
             if(sum<=0)break;
         }
         return index;
    }
}

1713. 得到子序列的最少操作次数

class Solution {
    public int minOperations(int[] target, int[] arr) {
         Map<Integer,Integer> pos = new HashMap<Integer,Integer>();   
         List<Integer> ls = new ArrayList<Integer>();  
         int i;
         for(i=0;i<target.length;++i){
             pos.put(target[i],i);
         }

         for(i=0;i<arr.length;++i){
              if(pos.containsKey(arr[i])){
                  ls.add(pos.get(arr[i]));
              }
         }
         int[] a= new int[100002];
         int asize=0;
         for(i=0;i<ls.size();++i){
             int l=1,r=asize;
             int ans = -1;
             while(l<=r){
                 int mid =(l+r)>>1;
                 if(ls.get(i) <= a[mid]){
                     r=mid-1;
                     ans = mid;
                 }else{
                     l=mid+1;
                 }
             }
             if(ans==-1){
                 a[++asize] = ls.get(i);
             }else{
                 a[ans] = ls.get(i);
             }
         }
         return target.length-asize;
    } 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值