哈希表的一个例子
力扣506. 相对名次
给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分。所有得分都 互不相同 。
运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推。运动员的名次决定了他们的获奖情况:
名次第 1 的运动员获金牌 “Gold Medal” 。
名次第 2 的运动员获银牌 “Silver Medal” 。
名次第 3 的运动员获铜牌 “Bronze Medal” 。
从名次第 4 到第 n 的运动员,只能获得他们的名次编号(即,名次第 x 的运动员获得编号 “x”)。
使用长度为 n 的数组 answer 返回获奖,其中 answer[i] 是第 i 位运动员的获奖情况。
示例 1:
输入:score = [5,4,3,2,1]
输出:["Gold Medal","Silver Medal","Bronze Medal","4","5"]
解释:名次为 [1st, 2nd, 3rd, 4th, 5th] 。
示例 2:
输入:score = [10,3,8,9,4]
输出:["Gold Medal","5","Bronze Medal","Silver Medal","4"]
解释:名次为 [1st, 5th, 3rd, 2nd, 4th] 。
提示:
n == score.length
1 <= n <= 104
0 <= score[i] <= 106
score 中的所有值 互不相同
哈希表解法
class Solution {
public String[] findRelativeRanks(int[] score) {
int n = score.length;
int[] scoreCopy = new int[n];
for (int i = 0; i < n; i++) {
scoreCopy[i] = score[i];
}
Arrays.sort(scoreCopy);
//声明并初始化了一个 HashMap,它将整数映射到字符串。
Map<Integer, String> map = new HashMap<>();
for (int i = n - 1; i >= 0; i--) {
if (i == n - 1) {
map.put(scoreCopy[i], "Gold Medal");
} else if (i == n - 2) {
map.put(scoreCopy[i], "Silver Medal");
} else if (i == n -3) {
map.put(scoreCopy[i], "Bronze Medal");
} else {
map.put(scoreCopy[i], n - i + "");
}
}
String[] res = new String[n];
for (int i = 0; i < n; i++) {
res[i] = map.get(score[i]);
}
return res;
}
}
哈希表
其中
Map<Integer, String> map = new HashMap<>();
这行代码声明并初始化了一个 HashMap,它将整数映射到字符串。具体解释如下:
详细解释
- 声明 map 变量
Map<Integer, String>:这是一个泛型接口 Map 的声明。Map 是 Java 中的一个接口,它表示一种键值对映射。
Integer:表示 Map 的键的类型为 Integer(整型)。
String:表示 Map 的值的类型为 String(字符串)。 - 初始化 map 变量
new HashMap<>():这部分创建了一个 HashMap 的实例。
HashMap 是 Map 接口的一个具体实现类,它使用哈希表来存储键值对,能够保证操作(插入、删除、查找)的时间复杂度为 O(1)。 - 作用
Map<Integer, String> map = new HashMap<>(); 初始化了一个空的 HashMap,此后你可以向 map 中添加键值对,或者根据键来查找值。这个 HashMap 可以用来存储各种数据,比如在之前的代码中,它用于将分数与相应的排名进行映射。
排序
Arrays.sort(arr, (a, b) -> b[0] - a[0]);
-
参数解释
arr:要排序的数组。在这里,arr 是一个二维数组,即 int[][] arr。
(a, b) -> b[0] - a[0]:这是一个 lambda 表达式,表示一个比较器,用于定义排序的顺序。 -
lambda 表达式 (a, b) -> b[0] - a[0]
a 和 b 都是 arr 中的元素,表示二维数组中的两个子数组。
b[0] - a[0]:这个表达式用于比较两个子数组的第一个元素,即分数。
如果 b[0] 大于 a[0],结果为正值,表示 b 应排在 a 之前。
如果 b[0] 小于 a[0],结果为负值,表示 a 应排在 b 之前。
如果 b[0] 等于 a[0],结果为零,表示 a 和 b 相对位置不变。
由于 b[0] - a[0],这是一个降序排序。 -
作用
这行代码将 arr 数组按分数从大到小排序。
排序方法
Arrays.sort 是 Java 标准库中的一个静态方法,用于对数组进行排序。Arrays.sort 方法内部采用了不同的排序算法,具体使用哪种算法取决于数组的类型和大小。
排序算法
- Dual-Pivot Quicksort
应用范围:用于对基本类型(如 int、char、double 等)的数组进行排序。
特点:一种优化版本的快速排序算法,使用两个枢轴(pivot)。它在大多数情况下表现非常好,平均时间复杂度为 𝑂(𝑛log𝑛),最坏情况时间复杂度为 O(n 2 ),但通过随机化和其他改进,可以避免最坏情况。 - Timsort
应用范围:用于对对象数组(如 Integer、String 等)进行排序。
特点:一种混合排序算法,结合了合并排序(Merge Sort)和插入排序(Insertion Sort)的优点。Timsort 是为排序现实世界数据而设计的,它在处理几乎排序的数组时表现非常好,最坏情况时间复杂度为 𝑂(𝑛log𝑛),在许多情况下,表现优于单纯的合并排序或快速排序。
其他方法
map.keySet()
获取key集
map.values()
获取value集
map.entrySet()
同时获取键值对集合key和value
map.containsKey(key)
判断key集中是否包含key
map.containsValue(value)
判断value集中是否包含value
参考: 如何获取hashmap的key和value