以力扣506题为例学习哈希表

力扣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

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值