一、简介
TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
二、实用方法
除了以上的介绍和常用的map方法之外,treemap还提供了比较实用的几个方法,对一些问题的处理会方便很多。
1)ceilingKey()
参数 key-- 此要匹配的键。 返回值 如果不存在这样的键在方法调用返回的最小键大于或等于键,则返回null。
2)floorKey()
参数 key-- 这是要匹配的键。 返回值 方法调用返回的最大键小于等于key,或者null,如果不存在这样的键。
三、示例
给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从 0 开始的字符串 s , 它只包含字符 '*' 和 '|' ,其中 '*' 表示一个 盘子 ,'|' 表示一支 蜡烛 。 同时给你一个下标从 0 开始的二维整数数组 queries ,其中 queries[i] = [lefti, righti] 表示 子字符串 s[lefti...righti] (包含左右端点的字符)。 对于每个查询,你需要找到 子字符串中 在 两支蜡烛之间 的盘子的 数目 。如果一个盘子在 子字符串中 左边和右边 都 至少有一支蜡烛,那么这个盘子满足在 两支蜡烛之间 。 比方说,s = "||**||**|*" ,查询 [3, 8] ,表示的是子字符串 "*||**|" 。 子字符串中在两支蜡烛之间的盘子数目为 2 ,子字符串中右边两个盘子在它们左边和右边 都 至少有一支蜡烛。 请你返回一个整数数组 answer ,其中 answer[i] 是第 i 个查询的答案。 示例: 输入:s = "**|**|***|", queries = [[2,5],[5,9]] 输出:[2,3] 解释: - queries[0] 有两个盘子在蜡烛之间。 - queries[1] 有三个盘子在蜡烛之间。
解答:
class Solution { public int[] platesBetweenCandles(String s, int[][] queries) { int[] result = new int[queries.length]; int[] r1 = new int[s.length()]; TreeMap<Integer, Integer> map = new TreeMap<>(); int flag = 0; int temp = 0; int pos = 0; // 获取每个蜡烛前面,在蜡烛之前的盘子数,之后任意两个位置之间的盘子数, // 便可以转换为离这两个位置最近的两个蜡烛负责的盘子数之差。 // 蜡烛位置为query数组中位置的子区间。 for(int i=0;i<s.length();i++){ if(s.charAt(i)-'|'==0){ if(flag==0){ r1[i]=0; flag++; pos = i; map.put(pos,0); }else{ int t0 = pos; pos = i; r1[pos]+=r1[t0]; r1[pos]+=temp; temp=0; map.put(pos,r1[pos]); } } if(s.charAt(i)-'*'==0&&flag>0){ temp++; } } for(int i=0;i<queries.length;i++){ // ceilingKey获取大于等于当前位置的最近蜡烛 Integer start = map.ceilingKey(queries[i][0]); // floorKey获取小于等于当前位置的最近蜡烛 Integer end = map.floorKey(queries[i][1]); if(start>end){ result[i]=0; }else{ result[i]=r1[end]-r1[start]; } } return result; } }