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

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


这里写目录标题

  • 一、628. 三个数的最大乘积
  • 二、645. 错误的集合
  • 三、747. 至少是其他数字两倍的最大数
  • 四、905. 按奇偶排序数组
  • 五、922. 按奇偶排序数组 II
  • 六、976. 三角形的最大周长

一、628. 三个数的最大乘积

简单
给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

示例 1:
输入:nums = [1,2,3]
输出:6

示例 2:
输入:nums = [1,2,3,4]
输出:24

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

class S628:
    def func(self, nums):
        nums.sort()
        return max(nums[0] * nums[1] * nums[2], nums[-1] * nums[-2] * nums[-3])


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

二、645. 错误的集合

简单
集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums 代表了集合 S 发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

示例 1:
输入:nums = [1,2,2,4]
输出:[2,3]

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

class S645:
    def func(self, nums):
        total = sum(range(len(nums) + 1))
        num = total - sum(set(nums))  # 3
        diff = total - sum(nums)  # 1
        return [num - diff, num]  # [2,3]


res = S645()
nums = [1, 2, 2, 4]
print(res.func(nums))

三、747. 至少是其他数字两倍的最大数

简单
给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。
请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1 。

示例 1:
输入:nums = [3,6,1,0]
输出:1
解释:6 是最大的整数,对于数组中的其他整数,6 至少是数组中其他元素的两倍。6 的下标是 1 ,所以返回 1 。

示例 2:
输入:nums = [1,2,3,4]
输出:-1
解释:4 没有超过 3 的两倍大,所以返回 -1 。

class S747:
    def func(self, nums):
        max_value = max(nums)
        if max_value > nums[-2] * 2:
            return nums.index(max_value)
        return -1


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

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

四、905. 按奇偶排序数组

简单
给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。
返回满足此条件的 任一数组 作为答案。

示例 1:
输入:nums = [3,1,2,4]
输出:[2,4,3,1]
解释:[4,2,3,1]、[2,4,1,3] 和 [4,2,1,3] 也会被视作正确答案。

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

思路:双指针

class Solution905:
    def func(self, nums):
        i = 0
        for j in range(len(nums)):
            if nums[j] % 2 == 0:
                nums[i], nums[j] = nums[j], nums[i]
                i += 1
        return nums

五、922. 按奇偶排序数组 II

简单
给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。
对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。
你可以返回 任何满足上述条件的数组作为答案 。

示例 1:
输入:nums = [4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。

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

class S922:
    def funcc(self, nums):
        i = 0
        j = 1
        while i < len(nums) and j < len(nums):
            if nums[i] % 2 == 0:
                i += 2  # 如果nums[0]为偶数,i+2
            elif nums[j] % 2 == 1:
                j += 2
            else:
                nums[i], nums[j] = nums[j], nums[i]
        return nums


s = S922()
nums = [4, 2, 5, 7]
print(s.funcc(nums))

六、976. 三角形的最大周长

简单
给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0。

示例 1:
输入:nums = [2,1,2]
输出:5
解释:你可以用三个边长组成一个三角形:1 2 2。

示例 2:
输入:nums = [1,2,1,10]
输出:0
解释:
你不能用边长 1,1,2 来组成三角形。
不能用边长 1,1,10 来构成三角形。
不能用边长 1、2 和 10 来构成三角形。
因为我们不能用任何三条边长来构成一个非零面积的三角形,所以我们返回 0。

class Solution:
    def largestPerimeter(self, nums: List[int]) -> int:
        numss = sorted(nums, reverse=True)
        print(numss)
        for i in range(len(numss) - 2):
            if numss[i] < numss[i + 1] + numss[i + 2]:
                return numss[i] + numss[i + 1] + numss[i + 2]

        return 0


res = Solution()
nums = [1, 2, 1, 10, 2]
print(res.largestPerimeter(nums))

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

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