知识储备--基础算法篇-数组

news2024/12/27 19:19:58

1.学习

2.数组

2.1第53题-最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

心得:一直在纠结这个连续的事情,最后发现根本没必要管,因为如果前一个数与当前数相加小于当前数,前面的部分就会直接被舍弃,如果相加大于当前数则会一直叠加。

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        dp = copy.deepcopy(nums)
        max_ = dp[0]
        for i in range(1,len(nums)):
            dp[i] = max(dp[i-1]+nums[i], dp[i])
            if max_ < dp[i]:
                max_ = dp[i]

        return max_

时间和内存占用太多,根本没必要再生成一个dp数组,直接用nums数组更新就行。 

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        # dp = copy.deepcopy(nums)
        max_ = nums[0]
        for i in range(1,len(nums)):
            nums[i] = max(nums[i-1]+nums[i], nums[i])
            if max_ < nums[i]:
                max_ = nums[i]

        return max_

 

2.2第56题-合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
class Solution(object):
    def merge(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: List[List[int]]
        """
        new_int = []
        a = []
        intervals.sort()
        for i in range(1,len(intervals)):
            # 前一个end大于后一个start
            if intervals[i-1][1] > intervals[i][0]:
                # 前一个end小于后一个end
                if intervals[i-1][1] <= intervals[i][1]:
                    intervals[i] = [intervals[i-1][0], intervals[i][1]]
                else:
                    intervals[i] = intervals[i-1]
            elif intervals[i-1][1] == intervals[i][0]:
                intervals[i] = [intervals[i-1][0], intervals[i][1]]
            else:
                new_int.append(intervals[i-1])

        new_int.append(intervals[-1])
        
        return new_int

2.3第189题-轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        # if k == 0:
        #     return nums
        nums1 = copy.deepcopy(nums)
        k = k % len(nums)
        start = len(nums)-k
        # nums2 = []
        # nums1 = nums[:start]
        # nums2 = nums[start:]
        
        for i in range(len(nums)):
            if i < k:
                nums[i] = nums[start+i]
            else:
                nums[i] = nums1[i-k]

感觉不用深拷贝整个数组

class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        k = k % len(nums)
        start = len(nums)-k
        nums1 = nums[:start]
        nums2 = nums[start:]
        for i in range(len(nums2)):
            nums[i] = nums2[i]
        for j in range(len(nums1)):
            nums[j+k] = nums1[j]

看了答案,发现我最早想出的方法就是最简单的答案,nums[:]=nums[start:]+nums[:start],但是发现一直不能修改nums的值,看了答案发现nums忘记加[:]了,吐了。

class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        k = k % len(nums)
        start = len(nums)-k
        nums[:] = nums[start:] + nums[:start]

2.4除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。

不要使用除法,且在 O(n) 时间复杂度内完成此题。

示例 1:

输入: nums = [1,2,3,4]
输出: [24,12,8,6]

先用最简单的遍历法,果然超时。

class Solution(object):
    def productExceptSelf(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        len_ = len(nums)
        answer = [1]*len_
        for i in range(len_):
            for j in range(len_):
                if j != i:
                    answer[i] = answer[i]*nums[j]
                
        return answer

 然后把数组分为i点的前半部分和后半部分相乘来计算,这样的话减少很多重复计算的时间。

class Solution(object):
    def productExceptSelf(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        # 可以把乘积分为前半部分和后半部分
        len_ = len(nums)
        answer = [1]*len_
        forward = [1]*len_
        back = [1]*len_
        for i in range(1,len_):
            forward[i] = forward[i-1]*nums[i-1]
        
        for j in reversed(range(len_-1)):
            back[j] = back[j+1]*nums[j+1]
        
        for k in range(len_):
            answer[k] = forward[k]*back[k]
        return answer

看了答案,知道了左边的乘积其实可以动态的变化

class Solution(object):
    def productExceptSelf(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        # 可以把乘积分为前半部分和后半部分
        len_ = len(nums)
        answer = [1]*len_
        back = 1
        for i in range(1,len_):
            answer[i] = answer[i-1]*nums[i-1]
        
        for j in reversed(range(len_)):
            answer[j] = answer[j]*back
            back = back * nums[j]

        return answer

2.5第41题-缺失的第一个正数

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

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

示例 1:

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

用最朴素的方法来寻找,不出所料,超时。

class Solution(object):
    def firstMissingPositive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        for i in range(len(nums)-1):
            j = 0
            while j < len(nums)-1-i:
                if nums[j] > nums[j+1]:
                    temp = nums[j]
                    nums[j] = nums[j+1]
                    nums[j+1] = temp
                j = j + 1
        
        # print(nums)
        if nums[-1] <= 0:
            return 1
        
        index_1 = 0
        for j in range(len(nums)):
            if nums[j] > 0:
                if nums[j] != 1:
                    return 1
                else:
                    index_1 = j
                    break
        a = 1
        # print(index_1)
        for k in range(index_1+1,len(nums)):
            a = a + 1
            if nums[k] == a:
                continue
            elif nums[k] == a-1:
                a = a - 1
                continue
            else:
                return a

        return a + 1

 看了解析,知道当nums长度为N时,正数的数目肯定在[1,N]范围内,这时候就可以用哈希表来查找,内存占用多但速度快。把nums中的数都放在哈希表中,然后遍历[1,N],如果有哈希表中不存在则返回i,若都存在则返回i+1。

class Solution(object):
    def firstMissingPositive(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        hash_table = set(nums)
        n = len(nums)
        a = 0
        for i in range(1,n+1):
            if i in hash_table:
                a = i
                continue
            else:
                return i
        
        return a + 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/964060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv5算法改进(13)— 替换主干网络之PP-LCNet

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。PP-LCNet是一个由百度团队针对Intel-CPU端加速而设计的轻量高性能网络。它是一种基于MKLDNN加速策略的轻量级卷积神经网络&#xff0c;适用于多任务&#xff0c;并具有提高模型准确率的方法。与之前预测速度相近的模型相比…

你真的懂分数吗?(二)——分数模型应用初探

早点关注我&#xff0c;精彩不错过&#xff01; 上回我们聊到了分数的数学结构和数学建模&#xff0c;构成了分数的基本数学模型。相关内容请戳&#xff1a; 你真的懂分数吗&#xff1f;&#xff08;一&#xff09;——分数的数学结构和建模 但是&#xff0c;这样的分数是定义在…

基于单片机的点阵电子显示屏上下左右移加减速系统

一、系统方案 本设计的任务就是完成一个1616的点阵设计&#xff0c;并能滚动显示“********************”内容。 主要内容是&#xff0c;能同时流动显示汉字&#xff1b;能实现显示汉字无闪烁&#xff1b;能实屏幕亮度较高。本LED显示屏能够以动态扫描的方式显示一个1616点阵汉…

性能可靠it监控系统,性能监控软件的获得来源有哪些

性能可靠的IT监控系统是企业IT运维的重要保障之一。以下是一个性能可靠的IT监控系统应该具备的特点&#xff1a; 高可用性 高可用性是IT监控系统的一个重要特点&#xff0c;它可以保证系统在24小时不间断监控的同时&#xff0c;保证系统服务的可用性和稳定性。为了实现高可用性…

TiDB x 安能物流丨打造一栈式物流数据平台

作者&#xff1a;李家林 安能物流数据库团队负责人 本文以安能物流作为案例&#xff0c;探讨了在数字化转型中&#xff0c;企业如何利用 TiDB 分布式数据库来应对复杂的业务需求和挑战。 安能物流作为中国领先的综合型物流集团&#xff0c;需要应对大规模的业务流程&#xff…

linux中dmesg命令用法

在Linux系统中&#xff0c;dmesg&#xff08;diagnostic message&#xff09;是一个非常有用的命令行工具&#xff0c;用于显示和控制内核环形缓冲区中的消息。这些消息通常包含系统启动时的内核生成的信息&#xff0c;例如硬件设备的状态&#xff0c;驱动程序的加载&#xff0…

【Python基础教程】快速找到多个字典中的公共键(key)的方法

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 方法一&#xff1a;for in循环 from random import randint, samplea1 {k: randint(1, 4) for k in abcdefg} a2 {k: randint(1, 4) for k in abc123456…

Qt应用开发(基础篇)——输入对话框 QInputDialog

一、前言 QInputDialog类继承于QDialog&#xff0c;是一个简单方便的对话框&#xff0c;用于从用户获取单个值。 对话框窗口 QDialog QInputDialog输入对话框带有一个文本标签、一个输入框和标准按钮。输入内容可以字符、数字和选项&#xff0c;文本标签用来告诉用户应该要输入…

一文看遍半监督学习模型(Semi-Supervised Learning)

一、半监督学习的总体框架 二、一致性正则化模型 该算法旨在&#xff1a;一个模型对于同一个未标记图像&#xff0c;在图像添加额外噪声前后的预测值应该保持一致。 添加噪声的方法&#xff0c;如图像增强&#xff08;空间维度增强、像素维度增强&#xff09;。 同样&#x…

线性DP问题

目录 数字三角形DP 动态规划 [自上向下二维数组]DP 动态规划 [自上向下一维数组]DP 动态规划 [自下而上二维数组]DP 动态规划 [自下而上一维数组]记忆化搜索 DFS 最长上升子序列一维状态数组实现扩展&#xff1a;最长序列输出 最长上升子序列 II贪心二分优化算法思路代码实现扩…

2023蓝帽杯初赛

比赛总结就是首先审题要仔细&#xff0c;确定题目意思再去找才不会找错。 内存取证vol工具的使用不够熟练 然后容易走进死胡同&#xff0c;如果一个软件不能得到答案可以换一个看看&#xff0c;说不定就有答案了。 还有服务器取证很生疏&#xff0c;还是要多花时间做点题 取…

黑客之批处理编写

文章目录 一、批处理作用二、如何创建批处理三、批处理语法 一、批处理作用 自上而下成批的处理每一条命令&#xff0c;直到执行最后一条。这里的命令指的是DOS命令&#xff0c;在之前的【黑客常用DOS命令】博客中&#xff0c;我介绍了大量的常用DOS命令。不过我们之前输入命令…

Lesson3-5:OpenCV图像处理---模版匹配和霍夫变换

学习目标 掌握模板匹配的原理&#xff0c;能完成模板匹配的应用理解霍夫线变换的原理&#xff0c;了解霍夫圆检测知道使用OpenCV如何进行线和圆的检测 1 模板匹配 1.1 原理 所谓的模板匹配&#xff0c;就是在给定的图片中查找和模板最相似的区域&#xff0c;该算法的输入包括…

C++之map,set,multimap,multiset的使用

map&#xff0c;set&#xff0c;multimap&#xff0c;multiset的使用 关联式容器键值对树形结构的关联式容器setset介绍set的使用set定义方式set各种操作函数 multiset mapmap的介绍map的使用insert函数find函数erase函数[ ]运算符重载map的迭代器遍历 multimap 关联式容器 在…

ARM编程模型-状态模式

ARM的两种工作状态 大部分的ARM处理器都实现了两种指令集&#xff0c;32位ARM指令集和16位Thumb指令集&#xff0c;看生成的机器码是32位的还是16位的 ARM v6引入了新的指令集Thumb-2,能够提供32位和16位的混合指令&#xff0c;在增强了灵活性的同时保持了代码的高密度。 ARM的…

Linux基础学习2

Linux基础学习2 popen函数 popen函数 https://blog.csdn.net/yzy1103203312/article/details/78483566 https://blog.csdn.net/xy1413_/article/details/127135608 典型用法&#xff1a; FILE * fp popen("ifconfig eth0", "r"); if (!fp) { fprintf…

再谈IOS开发环境配置(2023-09-01 新)

关于IOS的开发&#xff0c;需要配置证书、密钥、管理标识符、功能配置等等&#xff0c;很是繁杂&#xff0c;以前也配置过&#xff0c;这次因为重新购买了新的M1笔记本&#xff0c;准备重新配置下&#xff0c;顺便记录&#xff0c;以便查询。 如果要开发IOS&#xff0c;首先需要…

2023高教社杯数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模…

JVM学习(一)--程序计数器

作用&#xff1a;记住下一个jvm指令的执行地址 每一行java源代码&#xff0c;会被编译为多行jvm指令&#xff0c;上文所说的执行地址就是这里的0,3,4等 &#xff0c;由于执行访问特别频繁&#xff0c;程序计数器的底层是有寄存器来实现的 特点&#xff1a; 线程私有&#xff…

爬虫进阶-反爬破解5(selenium的优势和点击操作+chrome的远程调试能力+通过Chrome隔离实现一台电脑登陆多个账号)

目录 一、selenium的优势和点击操作 二、chrome的远程调试能力 三、通过Chrome隔离实现一台电脑登陆多个账号 一、selenium的优势和点击操作 1.环境搭建 工具&#xff1a;Chrome浏览器chromedriverselenium win用户&#xff1a;chromedriver.exe放在python.exe旁边 MacO…