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

 

相关文章
|
算法 Java
ARTS打卡
ARTS打卡
|
JSON 缓存 搜索推荐
Progressive Web Apps(PWA):未来网络体验的崭新纪元
在当今数字化的世界中,Progressive Web Apps(PWA)已经成为了Web开发的一项重要趋势。PWA是一种结合了Web和原生应用程序优点的新型Web应用,它们提供了高性能、离线访问和优秀的用户体验。本博客将深入探讨PWA的概念、特点以及为什么它们对未来网络体验如此重要。
207 0
|
测试技术 UED
UI/UX设计:创造卓越用户体验的艺术和科学
在当今数字化的世界里,用户体验(UX)和用户界面(UI)设计已经成为任何成功应用程序或网站的关键要素。本博客将深入探讨UI/UX设计的核心概念、重要性以及如何创造令人难忘的用户体验。
128 0
|
3月前
|
Java 数据库 API
JSF与JPA的史诗级联盟:如何编织数据持久化的华丽织锦,重塑Web应用的荣耀
【8月更文挑战第31天】JavaServer Faces (JSF) 和 Java Persistence API (JPA) 分别是构建Java Web应用的用户界面组件框架和持久化标准。结合使用JSF与JPA,能够打造强大的数据驱动Web应用。首先,通过定义实体类(如`User`)和配置`persistence.xml`来设置JPA环境。然后,在JSF中利用Managed Bean(如`UserBean`)管理业务逻辑,通过`EntityManager`执行数据持久化操作。
57 0
|
6月前
|
安全 网络安全 数据库
01-Web 网络安全纵观与前景分析
01-Web 网络安全纵观与前景分析
|
6月前
|
前端开发 安全 搜索推荐
未来前端开发的新趋势:Web3.0与区块链技术的融合
【2月更文挑战第12天】 本文探讨了Web3.0和区块链技术对未来前端开发领域的影响。不同于传统摘要的简单概括,我们将通过一个创新的视角,深入解析这两项技术如何共同塑造前端开发的新生态,引领未来互联网的方向。文章首先介绍了Web3.0和区块链技术的基本概念,随后详细分析了它们在提高数据安全性、增强用户体验和推动去中心化应用(DApp)开发上的具体应用。最后,我们将展望这一趋势对前端开发者技能要求的变化,以及如何准备迎接这一变革。
|
机器学习/深度学习 人工智能 前端开发
Web3.0时代的前端开发挑战与机遇
Web3.0时代的前端开发挑战与机遇
335 0
|
缓存 移动开发 监控
从Weex到Web,性能逆势如何破局?
双11如丝般顺滑的服务体验背后,是技术团队对性能优化不断地探索尝试、升级迭代。今年飞猪会场实现了主会场直出、重点会场秒开、整体会场体感优秀。飞猪前端技术太吾分享飞猪在前端性能优化上面临的挑战及优化方向,详解在端侧预渲染、SSR、SnapShot、SPA、资源和数据预缓存及监控和诊断上的优化细节。
从Weex到Web,性能逆势如何破局?
|
机器学习/深度学习 人工智能 前端开发
智能UI:面向未来的UI开发技术
随着机器学习和人工智能渗入到各行各业,随着你画我猜、智能推荐、以图搜图、尬舞……渗入生活的方方面面,前端作为编程领域的一支,也必将迎来更多变化和挑战。
智能UI:面向未来的UI开发技术
|
XML Java C#
从Google Wave和XML看软件复杂性之争,互联网营销
  软件公司热衷于雇佣喜欢挑战技术难题的人。表面上看这种做法没什么问题,不幸的是,这会导致公司处于一种情形,你让他们开发一款产品,他们开发的产品更多的是来满足他们对各种技术挑战的好奇心,而不是用来解决客户的问题。
1312 0