leetcode 506. 相对名次

  • 题目描述
  • 解题思路
  • 执行结果
leetcode 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 中的所有值 互不相同

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

解题思路

法1

排序+hash
需要输出排名,我们可以所有排序算法快速得到排名,但是还要按原位置进行输出

所以我们可以增加一个map来映射位置,就是key为分数value为位置,我们就可以通过排名的分数找到获得该分数的人的位置

  • 时间复杂度(O(nlogn))
  • 空间复杂度(O(n))

执行结果

法1

func findRelativeRanks(score []int) []string {
 l := len(score)
 if l < 3 { //特殊情况:长度小于3时
  if l == 1 {
   return []string{"Gold Medal"}
  } else {
   if score[0] > score[1] {
    return []string{"Gold Medal""Silver Medal"}
   } else {
    return []string{"Silver Medal""Gold Medal"}
   }
  }
 }
 m := make(map[int]int//增加映射
 for i := 0; i < l; i++ {
  m[score[i]] = i
 }
 sort.Ints(score) //排序
 r := make([]string, l)
 for i := 0; i < l-3; i++ {
  r[m[score[i]]] = fmt.Sprintf("%d", l-i) //赋值
 }
 r[m[score[l-3]]] = "Bronze Medal"
 r[m[score[l-2]]] = "Silver Medal"
 r[m[score[l-1]]] = "Gold Medal"
 return r
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 12 ms , 在所有 Go 提交中击败了 72.29% 的用户 内存消耗: 6.6 MB , 在所有 Go 提交中击败了 7.23% 的用户 通过测试用例: 17 / 17

本文由 mdnice 多平台发布

你可能感兴趣的:(后端)