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 等。
  • 熟悉数据处理和分析的方法,如数据清洗、数据可视化等。
  • 掌握机器学习的基本概念和技术,如监督学习、无监督学习、深度学习等。

 

相关文章
|
JSON 缓存 搜索推荐
Progressive Web Apps(PWA):未来网络体验的崭新纪元
在当今数字化的世界中,Progressive Web Apps(PWA)已经成为了Web开发的一项重要趋势。PWA是一种结合了Web和原生应用程序优点的新型Web应用,它们提供了高性能、离线访问和优秀的用户体验。本博客将深入探讨PWA的概念、特点以及为什么它们对未来网络体验如此重要。
201 0
|
测试技术 UED
UI/UX设计:创造卓越用户体验的艺术和科学
在当今数字化的世界里,用户体验(UX)和用户界面(UI)设计已经成为任何成功应用程序或网站的关键要素。本博客将深入探讨UI/UX设计的核心概念、重要性以及如何创造令人难忘的用户体验。
125 0
|
1天前
|
人工智能 安全 物联网
区块链技术的未来展望:去中心化金融(DeFi)与Web 3.0的融合
区块链技术的未来展望:去中心化金融(DeFi)与Web 3.0的融合
|
3月前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
45 0
|
4月前
|
算法 计算机视觉 C++
web 丨 nft 元宇宙链游项目系统开发模式逻辑详细(成熟源码)
一、什么是元宇宙? 元宇宙指的是通过虚拟增强的物理现实,呈现收敛性和物理持久性特征的,基于未来互联网,具有链接感知和共享特征的 3D 虚拟空间。 大概可以从时空性、真实性、独立性、连接性四个方面交叉描述元宇宙:
|
6月前
|
安全 网络安全 数据库
01-Web 网络安全纵观与前景分析
01-Web 网络安全纵观与前景分析
|
6月前
|
前端开发 安全 搜索推荐
未来前端开发的新趋势:Web3.0与区块链技术的融合
【2月更文挑战第12天】 本文探讨了Web3.0和区块链技术对未来前端开发领域的影响。不同于传统摘要的简单概括,我们将通过一个创新的视角,深入解析这两项技术如何共同塑造前端开发的新生态,引领未来互联网的方向。文章首先介绍了Web3.0和区块链技术的基本概念,随后详细分析了它们在提高数据安全性、增强用户体验和推动去中心化应用(DApp)开发上的具体应用。最后,我们将展望这一趋势对前端开发者技能要求的变化,以及如何准备迎接这一变革。
|
机器学习/深度学习 人工智能 前端开发
Web3.0时代的前端开发挑战与机遇
Web3.0时代的前端开发挑战与机遇
330 0
|
6月前
|
前端开发 区块链 vr&ar
前端开发新趋势:Web3、区块链和虚拟现实
前端开发新趋势:Web3、区块链和虚拟现实
NAGA链游WEB3.0航海士游戏系统开发技术
NAGA链游WEB3.0航海士游戏系统开发技术