LeetCode——2034.股票价格波动

通过万岁!!!

  • 题目:股票的价格一直是波动的,进行了统计,然后给你一个数组,里面是timestamp和price分别表示统记的时间和统计时的价格,然后问任意时刻的最新价格(调用current方法)、之前的最高价格(调用maximum方法)、之前的最低价格(调用minimum方法)。然后还有就是更新和添加的方法update传入的就是timestamp和price,然后如果两次输入的时间点一样,就表示之前的输出错了。
  • 思路:
    • 首先我们需要一个map,这个map需要按照key进行排序。这样,我们把时间当作key,每次获取当前的时候,我们返回这个map的最大的key对应的value即可。
    • 然后就是对价格以及价格变化的分析。首先我们的价格也应该是排序的,这样才能获取这个最大值,和最小值。但是插入就排序的数组好像是没有的,或者自己定义一个。这里没有自己定义,因为我们上面说了,map中有对key进行排序的,我们就用它就行了。
    • 然后就是问题的关键了,你修改这个如果是最大的或者最小的(这里我们按照修改最大的来分析),那最大的价格变成了啥?变成了之前第二大的对吧?但是之前第二大的是多少?有可能等于这个最大的,也有可能小于这个最大的,对吧。
    • 小于时候很好理解。下面说一下等于的时候。
    • 第一天记录的是10,那么最大的是10,第二天记录的也是10,最大的还是10,然后发现第一天录入错了应该是5,那么你说最大的应该是多少?是不是10,这个10是二天录入的。你修改的是第一天的。
    • 这样我们就需要记录这个最大的是第几天录入的,但是太麻烦了,完全不用,我们只需要知道这个最大的有几天就可以了。如果有两天,那么修改一天以后,最大值还是不变即可,但是录入的天数就是1了。这个次数我们完全可以用这个map的value来记录啊。如果已经是1了,直接删除这个键值对。完美!
  • 技巧:TreeMap,这是一个可以按照key进行排序的map。

伪代码

成员变量中首先定义两个map,分别叫timeMap和priceMap,分别表示时间-价格的map和价格-天数的map
构造方法中
    初始化这两个map,这里可以对map进行排序条件的设置。这里两个map都是升序即可,默认就是升序。
然后就是更新的方法
    我们通过timeMap看这个时间之前存储过了没有,如果存储过
        那么就获取之存储的价格是多少,然后通过priceMap获取有多少天
        如果天数等于1
            直接删除这个键值对,因为之前填错了
        否则天数一定是大于1的
            将天数-1,重新入map,因为之前填错了
    注意,这里没有timeMap不存在的否则,因为存在的时候,我们只是修改了错误内容,并没有添加正确内容,下面添加正确内容,并且如果timeMap中不存在下面的内容也要执行。
    首先,timeMap中现在传入的时间节点和价格
    然后判断这个价格是不是在priceMap中,如果存在
        则将原priceMap中对应的value加1
    否则
        不存在,则直接加入,并且值设置为1
获取当前最新的方法
  直接拿timeMap中最大值的key对应的value即可
获取最大的价格的方法
    直接拿priceMap中最大的值
获取最小的价格的方法
    直接拿priceMap中最小的值

java代码

class StockPrice {
    TreeMap<Integer, Integer> timeMap;
    TreeMap<Integer, Integer> priceMap;


    public StockPrice() {
        // 按照key升序的map
        timeMap = new TreeMap<Integer, Integer>();
        priceMap = new TreeMap<Integer, Integer>(new Comparator<Integer>() {
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });
    }


    public void update(int timestamp, int price) {
        if (timeMap.containsKey(timestamp)) {// 这个时间之前存过
            Integer oldPrice = timeMap.get(timestamp);
            Integer timeNum = priceMap.get(oldPrice);// 通过时间获取旧价格,再通过价格获取时间列表
            if (timeNum == 1) {// 直接将priceMap中存在的删除
                priceMap.remove(timeMap.get(timestamp));
            } else {
                priceMap.put(oldPrice, timeNum - 1);
            }
        }
        timeMap.put(timestamp, price);
        if (priceMap.containsKey(price))
            priceMap.put(price, priceMap.get(price) + 1);
        else
            priceMap.put(price, 1);
    }


    public int current() {
        return timeMap.get(timeMap.lastKey());
    }


    public int maximum() {
        return priceMap.lastKey();
    }


    public int minimum() {
        return priceMap.firstKey();
    }
}
  • 总结:题目不是很难,主要是需要用到一个能够排序的map。并且两个map一定要明确key和value中存储什么内容。

你可能感兴趣的:(算法,leetcode,算法,java)