跟着leedcode刷算法 -- 排序与检索1

这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战

image.png

题1

最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例 1:

  • 输入:nums = [10,2]
  • 输出:"210"

示例 2:

  • 输入:nums = [3,30,34,5,9]
  • 输出:"9534330"

示例 3:

  • 输入:nums = [1]
  • 输出:"1"

示例 4:

  • 输入:nums = [10]
  • 输出:"10"

 

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 109

相关标签

  • 贪心
  • 字符串
  • 排序

暴力一点直接递归方法 时间上比较慢 :

class Solution:
    def largestNumber(self, nums: List[int]) -> str:
        res = ''
        for i in range(len(nums) - 1):
            for j in range(i + 1, len(nums)):
                if int(str(nums[i]) + str(nums[j])) < int(str(nums[j]) + str(nums[i])):
                    nums[i], nums[j] = nums[j], nums[i]
            res += str(nums[i])
        res += str(nums[-1])
        return '0' if int(res) == 0 else res

复制代码

执行结果:

image.png

题2

摆动排序 II

给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。

你可以假设所有输入数组都可以得到满足题目要求的结果。

示例 1:

  • 输入:nums = [1,5,1,1,6,4]
  • 输出:[1,6,1,5,1,4]
  • 解释:[1,4,1,5,1,6] 同样是符合题目要求的结果,可以被判题程序接受。

示例 2:

  • 输入:nums = [1,3,2,2,3,1]
  • 输出:[2,3,1,3,1,2]

 

提示:

  • 1 <= nums.length <= 5 * 104
  • 0 <= nums[i] <= 5000
  • 题目数据保证,对于给定的输入 nums ,总能产生满足题目要求的结果

 

  • 进阶:你能用 O(n) 时间复杂度和 / 或原地 O(1) 额外空间来实现吗?

相关标签

  • 数组
  • 分治
  • 快速选择
  • 排序

思路: 倒排 排序 计算中位数 进行插入

class Solution:
    def wiggleSort(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        nums.sort(reverse=True)
        ans = len(nums) // 2
        nums[1::2],nums[0::2] = nums[:ans], nums[ans:]

复制代码

执行结果:

image.png

Guess you like

Origin juejin.im/post/7034786773142077470