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 1≤n≤104。
- 0 ≤ s c o r e [ i ] ≤ 1 0 6 0 \le score[i] \le 10^6 0≤score[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 0≤m,n≤200。
- 1 ≤ m + n ≤ 200 1 \le m + n \le 200 1≤m+n≤200。
- − 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 −109≤nums1[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 = 0for 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 += 1break
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 0≤nums.length≤50000。
示例:
- 示例 1:
输入: [7,5,6,4]
输出: 5
解题思路
求解该题逆序列,我们可以先反转该序列,然后加入到新的数组我们每插入一个数时,插入前的数据,在原数组中比它小,并且在它后面可以和它构成逆序对的数字。而在反转序列中在下标就是逆序的统计结果。因此我们只需每次记录并累加插入点即可
我的题解
class Solution(object):def reversePairs(self, record):""":type record: List[int]:rtype: int"""res = 0nl = []n=len(record)for n in reversed(record):pos = bisect_left(nl,n)res += posnl.insert(pos,n)return res