LeetCode:75. 荷兰旗问题 - Python

189 篇文章 3 订阅
151 篇文章 2 订阅

问题描述:

75. Sort Colors(颜色分类)

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

此题中,我们使用整数012分别表示红色、白色和蓝色。

注意: 不能使用代码库中的排序函数来解决这道题。

示例:

输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]

进阶:

  1. 一个直观的解决方案是使用计数排序的两趟扫描算法。
  2. 首先,迭代计算出012元素的个数,然后按照012的排序,重写当前数组。
  3. 你能想出一个仅使用常数空间的一趟扫描算法吗?

问题分析:

方法1:进阶已经给出。
(1)先分别统计012的个数。
(2)然后根据大小重写 nums 数组。

方法2: 双指针方法

(1)用指针 i 负责统计 0 的个数,指针 j 负责统计 01总个数

(2)遍历 nums 数组,先取出当前元素 v,然后把当前位置赋值为 2

(3)判断 v 如果小于 2j 指针就加一,把当前位置变为 1

(4)紧跟(3)后面,继续判断 v 是否为 0,如果为 0i 指针走一位置。

(5)直到遍历结束。

Python3实现:

方法1:

# @Time   :2018/12/02
# @Author :LiuYinxing

class Solution:

    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        cnt = [0] * 3
        for v in nums:  # 统计个数
            cnt[v] += 1

        j = 0
        for i in range(3):  # 根据大小重写 nums 数组
            while cnt[i]:
                nums[j] = i
                j += 1
                cnt[i] -= 1


if __name__ == '__main__':
    nums = [0, 2, 1, 0, 2, 1, 0]
    Solution().sortColors(nums)
    print(nums)

方法2:

class Solution:

    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        i = j = 0  # j 负责记录 0 、1 的个数, i 负责记录 0 的个数。
        for k in range(len(nums)):
            v = nums[k]
            nums[k] = 2
            if v < 2:  # 只要小于 2 就写入1
                nums[j] = 1
                j += 1
            if v == 0:  # 然后判断 0 的情况。
                nums[i] = 0
                i += 1


if __name__ == '__main__':
    nums = [0, 2, 1, 0, 2, 1, 0]
    Solution().sortColors(nums)
    print(nums)

声明: 总结学习,有问题或不妥之处,可以批评指正哦。

题目链接:leetcode-cn.com/problems/sort-colors/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
给定一个整数数组 nums 和一个目标值 target,要求在数组中找出两个数的和等于目标值,并返回这两个数的索引。 思路1:暴力法 最简单的思路是使用两层循环遍历数组的所有组合,判断两个数的和是否等于目标值。如果等于目标值,则返回这两个数的索引。 此方法的时间复杂度为O(n^2),空间复杂度为O(1)。 思路2:哈希表 为了优化时间复杂度,可以使用哈希表来存储数组中的元素和对应的索引。遍历数组,对于每个元素nums[i],我们可以通过计算target - nums[i]的值,查找哈希表中是否存在这个差值。 如果存在,则说明找到了两个数的和等于目标值,返回它们的索引。如果不存在,将当前元素nums[i]和它的索引存入哈希表中。 此方法的时间复杂度为O(n),空间复杂度为O(n)。 思路3:双指针 如果数组已经排序,可以使用双指针的方法来求解。假设数组从小到大排序,定义左指针left指向数组的第一个元素,右指针right指向数组的最后一个元素。 如果当前两个指针指向的数的和等于目标值,则返回它们的索引。如果和小于目标值,则将左指针右移一位,使得和增大;如果和大于目标值,则将右指针左移一位,使得和减小。 继续移动指针,直到找到两个数的和等于目标值或者左指针超过了右指针。 此方法的时间复杂度为O(nlogn),空间复杂度为O(1)。 以上三种方法都可以解决问题,选择合适的方法取决于具体的应用场景和要求。如果数组规模较小并且不需要考虑额外的空间使用,则暴力法是最简单的方法。如果数组较大或者需要优化时间复杂度,则哈希表或双指针方法更合适。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值