leetcode刷题(python)——(六)

01.03.07 练习题目(第 06 天)

1. 0506. 相对名次

1.1 题目大意

描述:给定一个长度为 n n n 的数组 s c o r e score score。其中 s c o r e [ i ] score[i] score[i] 表示第 i i i 名运动员在比赛中的成绩。所有成绩互不相同。

要求:找出他们的相对名次,并授予前三名对应的奖牌。前三名运动员将会被分别授予「金牌("Gold Medal")」,「银牌("Silver Medal")」和「铜牌("Bronze Medal")」。

说明

  • n = = s c o r e . l e n g t h n == score.length n==score.length
  • 1 ≤ n ≤ 1 0 4 1 \le n \le 10^4 1n104
  • 0 ≤ s c o r e [ i ] ≤ 1 0 6 0 \le score[i] \le 10^6 0score[i]106
  • s c o r e score score 中的所有值互不相同。

示例

  • 示例 1:
输入:score = [5,4,3,2,1]
输出:["Gold Medal","Silver Medal","Bronze Medal","4","5"]
解释:名次为 [1st, 2nd, 3rd, 4th, 5th]

解题思路

首先先做好排序,确认各个分数对应的名词,然后通过字典将分数与名词形成映射,随后对原表进行遍历,在字典中寻找结果

我的题解

class Solution(object):
    def findRelativeRanks(self, score):
        """
        :type score: List[int]
        :rtype: List[str]
        """
        order = sorted(score, reverse = True)
        medal = ["Gold Medal","Silver Medal","Bronze Medal"]
        situation = dict()
        for i in range(len(order)):
            if i <= 2: situation[order[i]] = medal[i]
            else:  situation[order[i]] = str(i+1)
        
        return [situation[i] for i in score]

  • 示例 2:
输入:score = [10,3,8,9,4]
输出:["Gold Medal","5","Bronze Medal","Silver Medal","4"]
解释:名次为 [1st, 5th, 3rd, 2nd, 4th]

2. 0088. 合并两个有序数组

2.1 题目大意

描述:给定两个有序数组 n u m s 1 nums1 nums1 n u m s 2 nums2 nums2

要求:将 n u m s 2 nums2 nums2 合并到 n u m s 1 nums1 nums1 中,使 n u m s 1 nums1 nums1 成为一个有序数组。

说明

  • 给定数组 n u m s 1 nums1 nums1 空间大小为$ m + n$ 个,其中前 m m m 个为 n u m s 1 nums1 nums1 的元素。 n u m s 2 nums2 nums2 空间大小为 n n n。这样可以用 n u m s 1 nums1 nums1 的空间来存储最终的有序数组。
  • n u m s 1. l e n g t h = = m + n nums1.length == m + n nums1.length==m+n
  • n u m s 2. l e n g t h = = n nums2.length == n nums2.length==n
  • 0 ≤ m , n ≤ 200 0 \le m, n \le 200 0m,n200
  • 1 ≤ m + n ≤ 200 1 \le m + n \le 200 1m+n200
  • − 1 0 9 ≤ n u m s 1 [ i ] , n u m s 2 [ j ] ≤ 1 0 9 -10^9 \le nums1[i], nums2[j] \le 10^9 109nums1[i],nums2[j]109

示例

  • 示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3][2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
  • 示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解释:需要合并 [1][] 。
合并结果是 [1]

解题思路

在该题中首先合并两个数组,然后因为两个数组都是有序的,所以可以使用插入排序或者选择排序,将后面的数据插入到前面的有序序列

我的题解

class Solution(object):
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: None Do not return anything, modify nums1 in-place instead.
        """
        t = 0
        for i in range(len(nums2)):
            nums1[m + i] = nums2[i]
        for i in range(m, m + n):
            for k in range(m + t):
                if nums1[i] < nums1[k]:
                    nums1.insert(k,nums1.pop(i))
                    t += 1
                    break 

3. 剑指 Offer 51. 数组中的逆序对

3.1 题目大意

描述:给定一个数组 n u m s nums nums

要求:计算出数组中的逆序对的总数。

说明

  • 逆序对:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。
  • 0 ≤ n u m s . l e n g t h ≤ 50000 0 \le nums.length \le 50000 0nums.length50000

示例

  • 示例 1:
输入: [7,5,6,4]
输出: 5

解题思路

求解该题逆序列,我们可以先反转该序列,然后加入到新的数组我们每插入一个数时,插入前的数据,在原数组中比它小,并且在它后面可以和它构成逆序对的数字。而在反转序列中在下标就是逆序的统计结果。因此我们只需每次记录并累加插入点即可

我的题解

class Solution(object):
    def reversePairs(self, record):
        """
        :type record: List[int]
        :rtype: int
        """
        
        res = 0
        nl = []
        n=len(record)
        for n in reversed(record):
            pos = bisect_left(nl,n)
            res += pos
            nl.insert(pos,n)
        return res

  • 23
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值