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

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


这里写目录标题

  • 一、1619. 删除某些元素后的数组均值
  • 二、1636. 按照频率将数组升序排序
  • 三、1859. 将句子排序
  • 四、15. 三数之和
  • 五、16. 最接近的三数之和

一、1619. 删除某些元素后的数组均值

简单
给你一个整数数组 arr ,请你删除最小 5% 的数字和最大 5% 的数字后,剩余数字的平均值。
与 标准答案 误差在 10-5 的结果都被视为正确结果。

示例 1:
输入:arr = [1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3]
输出:2.00000
解释:删除数组中最大和最小的元素后,所有元素都等于 2,所以平均值为 2 。

示例 2:
输入:arr = [6,2,7,5,1,2,0,3,10,2,5,0,5,5,0,8,7,6,8,0]
输出:4.00000

示例 3:
输入:arr = [6,0,7,0,7,5,7,8,3,4,0,7,8,1,6,8,1,1,2,4,8,1,9,5,4,3,8,5,10,8,6,6,1,0,6,10,8,2,3,4]
输出:4.77778

示例 4:
输入:arr = [9,7,8,7,7,8,4,4,6,8,8,7,6,8,8,9,2,6,0,0,1,10,8,6,3,3,5,1,10,9,0,7,10,0,10,4,1,10,6,9,3,6,0,0,2,7,0,6,7,2,9,7,7,3,0,1,6,1,10,3]
输出:5.27778

示例 5:
输入:arr = [4,8,4,10,0,7,1,3,7,8,8,3,4,1,6,2,1,1,8,0,9,8,0,3,9,10,3,10,1,10,7,3,2,1,4,9,10,7,6,4,0,8,5,1,2,1,6,2,5,0,7,10,9,10,3,7,10,5,8,5,7,6,7,6,10,9,5,10,5,5,7,2,10,7,7,8,2,0,1,1]
输出:5.29167

class S1619:
    def func(self, arr):
        arr.sort(reverse=True)
        a = int(len(arr) * 0.05)  # 需要删除的个数
        print(a)
        change_arr = arr[a:-a]
        print(arr[a:-a])  # [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
        return sum(change_arr) / len(change_arr)
        # return sum(arr[int(len(arr)*0.05):-int(len(arr)*0.05)])/len(arr)-(int(len(arr)*0.05*2))


res = S1619()
arr = [4, 8, 4, 10, 0, 7, 1, 3, 7, 8, 8, 3, 4, 1, 6, 2, 1, 1, 8, 0, 9, 8, 0, 3, 9, 10, 3, 10, 1, 10, 7, 3, 2, 1, 4, 9,
       10, 7, 6, 4, 0, 8, 5, 1, 2, 1, 6, 2, 5, 0, 7, 10, 9, 10, 3, 7, 10, 5, 8, 5, 7, 6, 7, 6, 10, 9, 5, 10, 5, 5, 7, 2,
       10, 7, 7, 8, 2, 0, 1, 1]
print(res.func(arr))

二、1636. 按照频率将数组升序排序

简单
给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。
请你返回排序后的数组。

示例 1:
输入:nums = [1,1,2,2,2,3]
输出:[3,1,1,2,2,2]
解释:‘3’ 频率为 1,‘1’ 频率为 2,‘2’ 频率为 3 。

示例 2:
输入:nums = [2,3,1,3,2]
输出:[1,3,3,2,2]
解释:‘2’ 和 ‘3’ 频率都为 2 ,所以它们之间按照数值本身降序排序。

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

class S1636:
    def func(self, nums):
        ss = Counter(nums)
        sss = sorted(ss.items(), key=lambda x: x[1])
        print(sss)
        res = []
        for i in sss:
            res += [i[0]] * i[1]
        return res


res = S1636()
nums = [1, 1, 2, 2, 2, 3]
print(res.func(nums))

三、1859. 将句子排序

简单
一个 句子 指的是一个序列的单词用单个空格连接起来,且开头和结尾没有任何空格。每个单词都只包含小写或大写英文字母。
我们可以给一个句子添加 从 1 开始的单词位置索引 ,并且将句子中所有单词 打乱顺序 。
比方说,句子 “This is a sentence” 可以被打乱顺序得到 “sentence4 a3 is2 This1” 或者 “is2 sentence4 This1 a3” 。
给你一个 打乱顺序 的句子 s ,它包含的单词不超过 9 个,请你重新构造并得到原本顺序的句子。

示例 1:
输入:s = “is2 sentence4 This1 a3”
输出:“This is a sentence”
解释:将 s 中的单词按照初始位置排序,得到 “This1 is2 a3 sentence4” ,然后删除数字。

示例 2:
输入:s = “Myself2 Me1 I4 and3”
输出:“Me Myself and I”
解释:将 s 中的单词按照初始位置排序,得到 “Me1 Myself2 and3 I4” ,然后删除数字。

class S1859:
    def func(self, s):
        ss = s.split()
        print(ss)  # ['is2', 'sentence4', 'This1', 'a3']
        res = [0] * len(ss)
        for i in ss:
            res[int(i[-1]) - 1] = i[0:-1]
        return ' '.join(res)


res = S1859()
s = "is2 sentence4 This1 a3"
print(res.func(s))

四、15. 三数之和

中等
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。

示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

class S15:
    def func(self, nums):
        nums.sort()
        res = []
        n = len(nums)
        if n < 3:
            return []

        for i in range(n):
            if nums[i] > 0:
                return res
            L = i + 1
            R = n - 1

            while L < R:
                if nums[i] + nums[L] + nums[R] == 0:
                    res.append([nums[i], nums[L], nums[R]])

                    while L < R and nums[L] == nums[L + 1]:
                        L = L + 1
                    while L < R and nums[R] == nums[R - 1]:
                        R = R - 1
                    L = L + 1
                    R = R - 1
                elif nums[i] + nums[L] + nums[R] > 0:
                    R = R - 1
                else:
                    L = L + 1
        return res


res = S15()
nums = [-1, 0, 1, 2, -1, -4]
print(res.func(nums))

五、16. 最接近的三数之和

中等
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。

示例 1:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

示例 2:
输入:nums = [0,0,0], target = 1
输出:0

class S16:
    def func(self, nums, target):
        nums.sort()
        ans = inf
        n = len(nums)
        if n < 3:
            return False
        for i in range(n):
            L = i + 1
            R = n - 1
            while L < R:

                if nums[i] + nums[L] + nums[R] == target:
                    return target
                tmp = nums[i] + nums[L] + nums[R]
                if abs(tmp - target) < abs(ans - target):
                    ans = tmp
                if tmp > target:
                    R = R - 1
                else:
                    L = L + 1
        return ans


res = S16()
nums = [0, 0, 0]
target = 1
print(res.func(nums, target))

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

你可能感兴趣的:(算法题,python,开发语言,算法,leetcode,pycharm)