ARTS 挑战打卡的3天,我学到了这些~

简介: ARTS 挑战打卡的3天,我学到了这些~

关于 ARTS 的释义 —— 每周完成一个 ARTS:

● Algorithm: 每周至少做一个 LeetCode 的算法题

● Review: 阅读并点评至少一篇英文技术文章

● Tips: 学习至少一个技术技巧

● Share: 分享一篇有观点和思考的技术文章


希望通过此次活动能聚集一波热爱技术的人,延续好奇、探索、实践、分享的精神。


一、问题

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。


请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。


示例 1:


输入:nums = [1,2,0]

输出:3

示例 2:


输入:nums = [3,4,-1,1]

输出:2

示例 3:


输入:nums = [7,8,9,11,12]

输出:1


提示:


1 <= nums.length <= 5 * 105

-231 <= nums[i] <= 231 - 1


二、解决办法一

def firstMissingPositive(nums):
    for i, num in enumerate(nums):
        while 0 < num <= len(nums) and nums[num - 1] != num:
            nums[num - 1], num = num, nums[num - 1]
    for i, num in enumerate(nums):
        if num != i + 1:
            return i + 1
    return len(nums) + 1

这段代码实现了一个时间复杂度为 O(n) 的解决方案,可以在只使用常数级别额外空间的情况下找出未排序整数数组中没有出现的最小正整数。


首先,我们遍历整个数组 nums,对于每个元素 num,如果它大于 0 且小于等于数组长度,就将它与它在数组中的正确位置交换。这个过程的目的是将所有非负整数按照从小到大的顺序排列,同时将它们放到它们应该在的位置上。


接着,我们再次遍历整个数组 nums,找到第一个没有被放置在正确位置上的元素。这个元素就是我们要找的最小正整数。如果所有的元素都被放置在了正确的位置上,那么最后一个没有被放置在正确位置上的元素就是数组长度加一。


这个算法的关键在于利用了“交换”的思想,通过不断交换元素的位置来达到排序的目的。由于只使用了常数级别的额外空间,因此时间复杂度为 O(n)。


三、解决办法二

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        n = len(nums)
        num_to_idx = {}
        for i, num in enumerate(nums):
            if num <= n:
                num_to_idx[num] = i
            else:
                break
        for num in range(1, n + 2):
            if num not in num_to_idx:
                return num
        return n + 1

这个算法的核心思想是利用哈希表记录数组中每个元素出现的次数以及它们在原数组中的下标位置。通过遍历一遍数组,我们可以快速找到第一个没有被放置在正确位置上的元素,从而得到结果。

具体实现步骤如下:

  1. 创建一个长度为 n+1 的哈希表 num_to_idx,用于记录数组中每个元素出现的次数以及它们在原数组中的下标位置。
  2. 遍历整个数组 nums,对于每个元素 num,更新哈希表中 num 对应的值为它的出现次数加一,同时更新 num 对应的下标位置为它在原数组中的位置。
  3. 再次遍历整个数组 nums,对于每个元素 num,如果它在哈希表中对应的出现次数为 0,就将它作为结果返回。

这个算法的时间复杂度为 O(n),空间复杂度为 O(n)。

四、比较

两个解决方法的区别在于,第一个方法的时间复杂度为 O(n),空间复杂度为 O(1)。而第二个方法的时间复杂度也为 O(n),空间复杂度为 O(n)。因此,第一个方法更加高效

def firstMissingPositive(nums):
    if not nums:
        return 1
    n = len(nums)
    for i in range(n):
        while 1 <= nums[i] <= n and nums[nums[i] - 1] != nums[i]:
            nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
    for i in range(n):
        if nums[i] != i + 1:
            return i + 1
    return n + 1

五、下一步学习计划

  1. 基础语法和数据类型
  • 掌握 Python 中常用的内置函数和标准库。面向对象编程
  • 学习面向对象编程的基本概念,如类、对象、继承、多态等。
  • 熟悉 Python 中的类和对象的定义和使用方法,了解构造方法、析构方法、属性和方法的使用。
  • 掌握 Python 中常用的面向对象编程技术,如封装、继承、多态等。Web 开发
  • 学习 Python Web 开发框架,如 Flask、Django 等。
  • 熟悉 Web 开发的基础知识,如 HTTP 协议、RESTful API、前后端交互等。
  • 掌握 Web 开发中常用的技术,如模板引擎、数据库操作等。数据科学与机器学习
  • 学习 Python 中的数据科学库,如 Pandas、NumPyy、Scikit-Learn 等。
  • 熟悉数据处理和分析的方法,如数据清洗、数据可视化等。
  • 掌握机器学习的基本概念和技术,如监督学习、无监督学习、深度学习等。

 

相关文章
|
3月前
|
算法 测试技术 区块链
Web3.0的五大趋势,你是否已经了解?
Web3.0的五大趋势,你是否已经了解?
70 0
|
10月前
|
算法 Java
ARTS打卡
ARTS打卡
|
11月前
|
JSON 缓存 搜索推荐
Progressive Web Apps(PWA):未来网络体验的崭新纪元
在当今数字化的世界中,Progressive Web Apps(PWA)已经成为了Web开发的一项重要趋势。PWA是一种结合了Web和原生应用程序优点的新型Web应用,它们提供了高性能、离线访问和优秀的用户体验。本博客将深入探讨PWA的概念、特点以及为什么它们对未来网络体验如此重要。
116 0
|
存储 机器学习/深度学习 人工智能
【前沿技术RPA】 一文了解UiPath 机器人企业框架 (REFramework)
本博文主要介绍 UiPath 机器人企业框架 (REFramework)。我们将讨论事务处理、调度程序和执行程序的概念,还会简要介绍 REFramework 可以完成的任务。
【前沿技术RPA】 一文了解UiPath 机器人企业框架 (REFramework)
|
3月前
|
安全 网络安全 数据库
01-Web 网络安全纵观与前景分析
01-Web 网络安全纵观与前景分析
|
3月前
|
前端开发 安全 区块链
前沿技术探索:Web3.0与前端开发的融合之路
【2月更文挑战第12天】 在数字技术快速发展的今天,Web3.0作为互联网的新阶段,不仅预示着去中心化、更加智能化的网络环境,还为前端开发带来了前所未有的挑战与机遇。本文将深入探讨Web3.0对前端开发的影响,分析其在实际应用中如何与前端技术融合,以及前端开发者如何适应这一变革,把握新时代的技术趋势。通过案例分析与技术展望,我们将一窥Web3.0与前端开发融合的未来图景,为前端开发者提供新的思考和行动指南。
219 26
|
3月前
|
前端开发 安全 搜索推荐
未来前端开发的新趋势:Web3.0与区块链技术的融合
【2月更文挑战第12天】 本文探讨了Web3.0和区块链技术对未来前端开发领域的影响。不同于传统摘要的简单概括,我们将通过一个创新的视角,深入解析这两项技术如何共同塑造前端开发的新生态,引领未来互联网的方向。文章首先介绍了Web3.0和区块链技术的基本概念,随后详细分析了它们在提高数据安全性、增强用户体验和推动去中心化应用(DApp)开发上的具体应用。最后,我们将展望这一趋势对前端开发者技能要求的变化,以及如何准备迎接这一变革。
|
3月前
|
前端开发 区块链 vr&ar
前端开发新趋势:Web3、区块链和虚拟现实
前端开发新趋势:Web3、区块链和虚拟现实
|
机器学习/深度学习 人工智能 前端开发
Web3.0时代的前端开发挑战与机遇
Web3.0时代的前端开发挑战与机遇
257 0
|
存储 算法 区块链
技术创新:Web3到底是什么技术?
凯文·凯利说要关注那些还没有形成共识的新概念,我们现在没有办法用准确的词语去定义它,但最终它会被确定,它会形成新的职业。所以我们有必要去了解一下最近几年很火的web3。
248 0
技术创新:Web3到底是什么技术?