【数据结构与算法】之排序系列-20240205

【数据结构与算法】之排序系列-20240205_第1张图片


这里写目录标题

  • 一、1346. 检查整数及其两倍数是否存在
  • 二、1365. 有多少小于当前数字的数字
  • 三、1460. 通过翻转子数组使两个数组相等
  • 四、1491. 去掉最低工资和最高工资后的工资平均值
  • 五、1502. 判断能否形成等差数列

一、1346. 检查整数及其两倍数是否存在

简单
给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。
更正式地,检查是否存在两个下标 i 和 j 满足:

i != j
0 <= i, j < arr.length
arr[i] == 2 * arr[j]

示例 1:
输入:arr = [10,2,5,3]
输出:true
解释:N = 10 是 M = 5 的两倍,即 10 = 2 * 5 。

示例 2:
输入:arr = [7,1,14,11]
输出:true
解释:N = 14 是 M = 7 的两倍,即 14 = 2 * 7 。

示例 3:
输入:arr = [3,1,7,11]
输出:false
解释:在该情况下不存在 N 和 M 满足 N = 2 * M 。

class S1356:
    def func(self, arr):
        return sorted(arr, key=lambda x: (bin(x).count("1"), x))


res = S1356()
arr = [2, 3, 5, 7, 11, 13, 17, 19]
print(res.func(arr))

二、1365. 有多少小于当前数字的数字

简单
给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。
换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。
以数组形式返回答案。

示例 1:
输入:nums = [8,1,2,2,3]
输出:[4,0,1,1,3]
解释:
对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。
对于 nums[1]=1 不存在比它小的数字。
对于 nums[2]=2 存在一个比它小的数字:(1)。
对于 nums[3]=2 存在一个比它小的数字:(1)。
对于 nums[4]=3 存在三个比它小的数字:(1,2 和 2)。

示例 2:
输入:nums = [6,5,4,8]
输出:[2,1,0,3]

示例 3:
输入:nums = [7,7,7,7]
输出:[0,0,0,0]

class S1356:
    def func(self, nums):
        nn = sorted(nums)
        dic = {}
        for i, n in enumerate(nn):
            if n not in dic:
                dic[n] = i
        print(dic)  # {4: 0, 5: 1, 6: 2, 8: 3}
        return [dic[n] for n in nums]  # [6,5,4,8]


res = S1356()
nums = [6, 5, 5, 4, 8]
print(res.func(nums))

三、1460. 通过翻转子数组使两个数组相等

简单
给你两个长度相同的整数数组 target 和 arr 。每一步中,你可以选择 arr 的任意 非空子数组 并将它翻转。你可以执行此过程任意次。
如果你能让 arr 变得与 target 相同,返回 True;否则,返回 False 。

示例 1:
输入:target = [1,2,3,4], arr = [2,4,1,3]
输出:true
解释:你可以按照如下步骤使 arr 变成 target:
1- 翻转子数组 [2,4,1] ,arr 变成 [1,4,2,3]
2- 翻转子数组 [4,2] ,arr 变成 [1,2,4,3]
3- 翻转子数组 [4,3] ,arr 变成 [1,2,3,4]
上述方法并不是唯一的,还存在多种将 arr 变成 target 的方法。

示例 2:
输入:target = [7], arr = [7]
输出:true
解释:arr 不需要做任何翻转已经与 target 相等。

示例 3:
输入:target = [3,7,9], arr = [3,7,11]
输出:false
解释:arr 没有数字 9 ,所以无论如何也无法变成 target 。

class Solution:
    def canBeEqual(self, target: List[int], arr: List[int]) -> bool:
        return Counter(target) == Counter(arr)

四、1491. 去掉最低工资和最高工资后的工资平均值

简单
给你一个整数数组 salary ,数组里每个数都是 唯一 的,其中 salary[i] 是第 i 个员工的工资。
请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。

示例 1:
输入:salary = [4000,3000,1000,2000]
输出:2500.00000
解释:最低工资和最高工资分别是 1000 和 4000 。
去掉最低工资和最高工资以后的平均工资是 (2000+3000)/2= 2500

示例 2:
输入:salary = [1000,2000,3000]
输出:2000.00000
解释:最低工资和最高工资分别是 1000 和 3000 。
去掉最低工资和最高工资以后的平均工资是 (2000)/1= 2000

示例 3:
输入:salary = [6000,5000,4000,3000,2000,1000]
输出:3500.00000
示例 4:

输入:salary = [8000,9000,2000,3000,6000,1000]
输出:4750.00000

class S1491:
    def func(self, salary):
        salary.sort(reverse=True)
        return sum(salary[1:-1]) // len(salary[1:-1])


res = S1491()
salary = [4000, 3000, 1000, 2000]
print(res.func(salary))

五、1502. 判断能否形成等差数列

简单
给你一个数字数组 arr 。
如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。
如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。

示例 1:
输入:arr = [3,5,1]
输出:true
解释:对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。

示例 2:
输入:arr = [1,2,4]
输出:false
解释:无法通过重新排序得到等差数列。

class S1502:
    def func(self, arr):
        arr.sort()
        for i in range(1, len(arr) - 1):
            if arr[i + 1] - arr[i] != arr[i] - arr[i - 1]:
                return False
        return True


res = S1502()
arr = [1, 2, 4]
print(res.func(arr))

【数据结构与算法】之排序系列-20240205_第2张图片

你可能感兴趣的:(算法题,python,开发语言,数据结构,散列表,leetcode)