已做过算法题总结

news2024/11/24 18:40:11

217、存在重复元素(easy)

输入:nums = [1,2,3,1]
输出:true
输入:nums = [1,2,3,4]
输出:false
输入:nums = [1,1,1,3,3,4,3,2,4,2]
输出:true

        给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        nums.sort()
        j=1
        while(j<len(nums)):
            if nums[j-1]==nums[j]:
                return True
            else:
                j+=1
        return False
class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        nums_pr=set(nums)
        if len(nums_pr)!=len(nums):
            return True
        else :
            return False

        总结:第二种方法毫无疑问是最优的牺牲了内存但加快了时间

                第一种是局部算法:(1)用sort()先排序 (2)用while循环(记住设置条件)进行相互两个比较,只要出现一个相等,就能返回。

                第二种是全局算法:(1)使用set()函数全部转化为集合(集合是不允许有相同值)  (2)比较两个前后长度。  


53、最大子数组和(medium)

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

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

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        size = len(nums)
        pre = 0
        res = nums[0]
        for i in range(size):
            pre = max(nums[i], pre + nums[i])
            res = max(res, pre)
        return res

        总结:总体思路就是 既要与后面num[i]比较大小,也要与前面累加和(边界值为res=num[0])比较大小。

                后面:如图所示,他首先需要一个pre,这个值起到的作用是连续相加,然后去与num[i]比较取最大值。所以通过实现。

                前面:

118、杨辉三角(做杨辉三角,首先要懂一些数据存在计算机中的逻辑,我做这道题的时候很多想不通,看了下面图才明白)

                 给定一个非负整数 numRows生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。

class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        b = list()
        for i in range(numRows):
            a = list()#此目的是形成一个每行的一个列表
            for j in range(i+1):
                if j==0 or j==i:#此处不能用while,while满足条件不会动;if 只满足一次就跳出
                    # a[i][j]=1
                    a.append(1)
                else:
                    # a[i][j]=a[i-1][j-1]+a[i-1][j]
                    a.append(b[i-1][j-1]+b[i-1][j])#因为循环,所以已经存在这些值
            b.append(a)#此表目的是领导的作用,接收各方面的信息
        return b

class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        dp = [[1]*(i+1) for i in range(numRows)]

        for i in range(2, numRows):
            for j in range(1,i):#这里有一个边界条件
                dp[i][j] = dp[i-1][j-1] + dp[i-1][j]

        return dp


 

总结:做杨辉三角重点是规律。 

        规律1:前两层i=0,i=1都是1。

        规律2:[i-1][j-1]+[i-1][j] 上一层的第j-1个元素和第j个元素相加。

        规律3:第几层就有几个元素。

        规律4:j==0或i==j的时候为0

第三种:

class Solution:
    def generate(self, numRows: int) -> List[List[int]]:
        a  = [[1]*(i+1) for i in range(numRows)]
        for i in range(numRows):
           
            for j in range(i+1):
                if j==0 or j==i:#此处不能用while,while满足条件不会动;if 只满足一次就跳出
                    a[i][j]=1
                    
                else:
                    a[i][j]=a[i-1][j-1]+a[i-1][j]
        return a

建议第三种方法,思路简单明了:

        只用设置一个参数:a  = [[1]*(i+1) for i in range(numRows)]

        第二层循环两个互斥条件:    

                                       (1)j==0或i==j的时候为0。

                                       (2)a[i][j]=a[i-1][j-1]+a[i-1][j]。

                                       (3)设置好循环边界值。(第三种方法边界值很好设定)

119、杨辉三角||

        会做杨辉三角,此题没有任何问题。

class Solution:
    def getRow(self, rowIndex: int) -> List[int]:
        row=[[1]*(i+1)  for i in range(rowIndex+1)]
        for i in range(rowIndex+1):
            for j in range(i+1):
                b=list()
                if j==0 or j==i:
                    row[i][j]=1
                else:
                    row[i][j]=row[i-1][j-1]+row[i-1][j]
        return row[rowIndex]

509、斐波那济数

        方法一(好理解):

class Solution:
    def fib(self, n: int) -> int:
        num=[0*i  for i in range(n+1)]
        print(len(num))
        #num=[0]*(n+1)
        if n==0:
            num[0]=0
        elif n==1:
            num[1]=1
        else:
            num[0]=0
            num[1]=1
            for i in range(2,n+1):
                num[i]=num[i-1]+num[i-2]
        return num[n]

        这个就有问题,虽然编译通过了,它是叠加:

         

直接下面操作,结束:

 方法二(递归):

class Solution:
    def fib(self, n: int) -> int:
        if n==0:
            return 0
        elif n==1:
            return 1
        else:
            return self.fib(n-1)+self.fib(n-2)

         当计算 fib(5) 时,我们共需要计算1次 fib(4),2次 fib(3),3次 fib(2),5次 fib(1) 和3次 fib(0)。这些无意义的重复计算使得递归效率极低。

        总结:最简单直接就第二种递归,但是时间消耗是真大。 

121、买卖股票的最佳时机

        给定一个数组 prices,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

class Solution:
    def maxProfit(self, prices: List[int]) -> int:

        res=prices[0]
        deff=0
        num=[0]*len(prices)
        for i in range(1,len(prices)):
            res=min(prices[i],res)
            num[i]=max(num[i-1],prices[i]-res)
        
        return num[-1]

        这道题和(53、最大子数组和)是同种类型的题。

        思路:

        (1)、res=min(prices[i],res)首先找出比prices[0]大的值,等于或小于prices[0],最后num都会存为0;

        (2)、num[i]=max(num[i-1],prices[i]-res)  就和num前面的比找最大的(因为是迭代,所以一直会保存最大的)。

746、使用最小费用爬楼梯(不好理解,真不好理解,但方法不难 ,主要是把cost中的数字都给消耗掉,所以dp长度比cost长)

        给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

(这道题,我最开始做的时候没看懂,现在看懂了,还是每次爬一个或者两个台阶,那就设置边界值使得cost的值全部用完 )。

class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        length_stair=len(cost)+1
        dp=[0]*length_stair
        for i in range(2,length_stair):#从最低的参数开始算。
            dp[i]=min(dp[i-2]+cost[i-2],dp[i-1]+cost[i-1])
        return dp[-1]
            

        可以从索引0和索引1开始走,那就让落后的0走两步,让落后的1走一步,这样就包含所有情况。(因为落后的0走一步会包含1的费用,很明显会花费更多

              拔高慢的,打压快的,收集所有情况。

        dp[i]=min(dp[i-2]+cost[i-2],dp[i-1]+cost[i-1]):最开始i=2时,已设置为0。

        dp的长度是比cost的长度多1

剑指Offer 10-11青蛙跳台阶问题

方法1:力扣通不过

class Solution:
    def numWays(self, n: int) -> int:
        if n==0:
            return 1
        elif n==1:
            return 1
        elif n==2:
            return 2
        else:
            return self.numWays(n-1)+self.numWays(n-2)

 

 

 

方法2_动态规划    dp[i]为第i个台阶(帮助理解):

class Solution:
    def numWays(self, n: int) -> int:
        if n==0:
            return 1
        elif n==1:
            return 1
        elif n==2:
            return 2
        else:
            dp=[0]*(n+1)
            dp=[0 for i in range(n+1)]
          
            dp[0]=1
            dp[1]=1
            dp[2]=2
            
            for i in range(2,n+1):
                dp[i]=dp[i-1]+dp[i-2]
        return dp[-1]%(1000000007)

         重点:dp[i]为第i个台阶(帮助理解)

70、爬楼梯

动态规划:

class Solution:
    def climbStairs(self, n: int) -> int:
        if n==1:
            return 1
        elif n==2:
            return 2
        else:  
            dp=[0]*(n+1)
            dp[0]=1
            dp[1]=1
            dp[2]=2
            for i in range(2,len(dp)):
                dp[i]=dp[i-1]+dp[i-2]
        return dp[n]

        动态规划题:此题切记0台阶也要设置1,要不然用动态规划有问题。

 628、三个数的最大乘积

        给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

class Solution:
    def maximumProduct(self, nums: List[int]) -> int:
        nums.sort()
        rr=nums[-1]*nums[-2]*nums[-3]
        td=nums[0]*nums[1]*nums[-1]

        if rr <td : 
            return td
        else:
            return rr
            

        调用函数: 

class Solution:
    def maximumProduct(self, nums: List[int]) -> int:
        nums.sort()
        max_dd=max(nums[0]*nums[1]*nums[-1],nums[-1]*nums[-2]*nums[-3])
        return max_dd

        sort()和sorted()区别:

 1528、重新排列字符串

        给你一个字符串 s 和一个 长度相同 的整数数组 indices 。请你重新排列字符串 s ,其中第 i 个字符需要移动到 indices[i] 指示的位置。返回重新排列后的字符串。

 

class Solution:
    def restoreString(self, s: str, indices: List[int]) -> str:
        length = len(s)
        result = [""] * length
        for i, ch in enumerate(s):
            result[indices[i]] = ch
        return "".join(result)

enumerate()函数不会用。

 

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

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

相关文章

【2106. 摘水果】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 在一个无限的 x 坐标轴上&#xff0c;有许多水果分布在其中某些位置。给你一个二维整数数组 fruits &#xff0c;其中 fruits[i] [positioni, amounti] 表示共有 amounti 个水果放置在 positioni 上…

Android平台播放透明视频

Android平台播放透明视频 思路 设计一种特殊的视频&#xff0c;它的一半内容存储alpha信息&#xff0c;另一半内容存储rgb信息&#xff0c;接着通过OpenGL获取每个像素点的alpha值和rgb值进行混合&#xff0c;最后出来的画面就是带有透明效果的视频了。 可以上下的分&#xf…

【疯狂造轮子-iOS】JSON转Model系列之二

1. 前言 上一篇《【疯狂造轮子-iOS】JSON转Model系列之一》实现了一个简陋的JSON转Model的库&#xff0c;不过还存在很多问题。下面我会尝试一个个去解决。 2. 存在问题及解决思路 2.1 没有考虑JSON数据并不一定是NSDictionary类型 有时候JSON并不一定是NSDictionary类型&…

【医学影像数据处理】2D/3D patch的crop和merge操作汇总

在做3D分割任务中&#xff0c;多数的方法多采用整体缩放&#xff0c;或裁剪成一个个小的patch操作&#xff0c;这样做的一个主要原因是内存问题。 相较于整体缩放&#xff0c;采用裁剪成patch的方法&#xff0c;对于小目标会更加的鲁棒&#xff0c;这也是大多数3D分割任务中常…

Leetcode448. 找到所有数组中消失的数字

Every day a leetcode 题目来源&#xff1a;448. 找到所有数组中消失的数字 解法1&#xff1a;STL set set 是一个集合类型的容器&#xff0c;里面的元素具有唯一性&#xff0c;并且所有元素都会根据元素的键值自动被排序&#xff0c;以红黑树为底层数据结构。 我们使用集合…

git上传大大大文件项目好折磨人

本来想把unity项目的源码上传上gitee啊&#xff0c;但是那个项目有1个多G&#xff0c;还是个半成品&#xff0c;要是写完&#xff0c;都不知道行不行 正常的上传 所用到的命令&#xff1a; 1、 git init 初始化&#xff0c;创建本地仓库 2、 git add . 添加到本地仓库 3、 git…

【C++】打开C++大门,踏入C++世界

文章目录 ☑️前言一. 浅看【C】关键字二. 命名空间1. 命名空间的定义&#x1f44c;2. 命名空间的使用&#x1f44c; 三. 【C】输入输出(IO)四. 缺省参数1. 缺省参数的概念&#x1f3c6;2. 缺省参数的分类&#x1f3c6; 五. 函数重载1. 函数重载的概念✌️2. 【C】支持函数重载…

【计算机专业漫谈】【计算机系统基础学习笔记】W2-2-2 模运算系统和补码表示

利用空档期时间学习一下计算机系统基础&#xff0c;以前对这些知识只停留在应试层面&#xff0c;今天终于能详细理解一下了。参考课程为南京大学袁春风老师的计算机系统基础MOOC&#xff0c;参考书籍也是袁老师的教材&#xff0c;这是我的听课自查资料整理后的笔记 补码表示法…

实验9 分类问题

1. 实验目的 ①掌握逻辑回归的基本原理&#xff0c;实现分类器&#xff0c;完成多分类任务&#xff1b; ②掌握逻辑回归中的平方损失函数、交叉熵损失函数以及平均交叉熵损失函数。 2. 实验内容 ①能够使用TensorFlow计算Sigmoid函数、准确率、交叉熵损失函数等&#xff0c;…

GEE:基于变异系数法的遥感环境风险评估指数(RSEI)计算

作者:CSDN @ _养乐多_ 本文记录了基于变异系数法计算 Risk-Screening Environmental Indicators (RSEI) 的方法和代码。使用 变异系数法计算权重来代替PCA方法计算权重,根据权重计算综合指标。本文也记录了使用landsat-8数据计算LST、NDVI、NDBSI、WET四个指标的代码。 结果…

密码学:其他常见密码学应用.

密码学&#xff1a;其他常见密码学应用. 密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律&#xff0c;应用于编制密码以保守通信秘密的&#xff0c;称为编码学&#xff1b;应用于破译密码以获取通信情报的&#xff0c;称为破译学&#xff0c;总称密码学. 目…

二叉树基础概念详解

文章目录 前言1. 树的基本概念2. 二叉树的基本概念3. 特殊二叉树&#x1f351; 满二叉树&#x1f351; 完全二叉树&#x1f351; 斜树 4. 二叉树的性质&#x1f351; 性质一&#x1f351; 性质二&#x1f351; 性质三&#x1f351; 性质四&#x1f351; 性质五&#x1f351; 性…

华为EC6108V9E/EC6108V9I_rk3228_安卓4.4.4_通刷_卡刷固件包

华为EC6108V9E&#xff0f;EC6108V9I_rk3228_安卓4.4.4_通刷_卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的…

【Java】线程池--ThreadPoolExecutor底层原理源码的理解

文章目录 一、根据代码查看jdk提供的3种线程池创建&#xff1a;二、3种方式源码分析1、Executors.newCachedThreadPool()2、Executors.newFixedThreadPool(10)3、Executors.newSingleThreadExecutor() 三、自定义方式执行提交优先级执行优先级 一、根据代码查看jdk提供的3种线程…

第2章Elasticsearch入门

1.正排索引和倒排索引 正排索引: 正排索引&#xff08;Forward Index&#xff09;是一种用于搜索引擎和文本检索系统的索引结构&#xff0c;它将文档中的每个单词都映射到该单词在文档中出现的位置。正排索引可以帮助快速定位、检索和渲染文档内容&#xff0c;但它需要消耗大…

AI 工具合辑盘点(十一)持续更新 之 AI 学术研究工具

许多学生和研究人员已经在利用人工智能进行研究。它可以让你更容易地了解最新研究成果&#xff0c;并帮助你组织和正确引用你最喜爱的研究论文。 从生成长篇研究论文摘要到通知你领域内的新趋势&#xff0c;研究中的AI工具节省了大量时间和精力。如果你在学术界&#xff0c;那…

数据库系统

目录 第三章、数据库系统1、数据库模式1.1、三级模式--两级映射1.2、数据库设计过程 2、ER模型3、关系代数与元组演算4、规范化理论4.1、函数依赖4.2、价值与用途4.3、键4.4、范式4.5、模式分解 5、并发控制6、数据库完整性约束7、数据备份8、数控故障与恢复9、数据仓库与数据挖…

网络安全合规-数据安全风险评估

一、法律依据&#xff1a; 依据《数据安全法》第三十条的规定&#xff0c;重要数据的处理者应当按照规定对其数据处理活动定期开展风险评估&#xff0c;并向有关主管部门报送风险评估报告。 依据《网络数据安全管理条例》&#xff08;征求意见稿&#xff09; 第三十二条规定&am…

实时通信的服务器推送机制 EventSource(SSE) 简介,附 go 实现示例

简介 不知道大家有没有见过 Content-Type:text/event-stream 的请求头&#xff0c;这是 HTML5 中的 EventSource 是一项强大的 API&#xff0c;通过服务器推送实现实时通信。 与 WebSocket 相比&#xff0c;EventSource 提供了一种简单而可靠的单向通信机制&#xff08;服务器…

《Linux 内核设计与实现》03. 进程管理

文章目录 进程描述符及任务结构分配进程描述符进程描述符的存放进程状态设置当前进程状态进程上下文进程家族树 进程创建线程在 Linux 中的实现创建线程内核线程 进程终结删除进程描述符孤儿进程 进程描述符及任务结构 内核把进程存放在任务队列&#xff08;task list&#xf…