力扣hot100_普通数组_python版本

力扣hot100_普通数组_python版本

一、53. 最大子数组和

在这里插入图片描述
  • 思路1:前缀和。
  • 代码
classSolution:defmaxSubArray(self, nums: List[int])->int:iflen(nums)==1:return nums[0] preSum =[0]*(len(nums)+1)for idx, n inenumerate(nums): preSum[idx+1]= preSum[idx]+ n res =-inf for idx, p inenumerate(preSum):for i inrange(idx): res =max(res, p-preSum[i])return res # 前缀和比较好写,但是上面复杂度太高,没法AK# 其实每次我们只需要减去最小的前缀和,维护一个最小的前缀和,就不需要多一层循环。优化如下classSolution:defmaxSubArray(self, nums):iflen(nums)==1:return nums[0] res =-inf preSum =0 minPreSum =0for n in nums: preSum += n res =max(res, preSum - minPreSum) minPreSum =min(minPreSum, preSum)return res 
  • 思路2:dp
    • 定义dp[i],表示以nums[i]j结尾的最大子数组和。当来到第i个位置,有两种可能
    1. 以dp[i] = nums[i],单独成一个子数组
    2. dp[i] = dp[i-1] + nums[i],这种情况需要dp[i-1] >=0
  • 代码
classSolution:defmaxSubArray(self, nums): dp =[0]*len(nums) dp[0]= nums[0]for i inrange(1,len(nums)): dp[i]=max(dp[i-1],0)+ nums[i]returnmax(dp)

二、56. 合并区间

在这里插入图片描述
  • 思路:先将intervals中的区间按起始排序。这样每个新来的区间就不用和已经确定好没要交集的区间比较了。
  • 代码
classSolution:defmerge(self, intervals: List[List[int]])-> List[List[int]]: intervals.sort(key=lambda p:p[0]) res =[]for p in intervals:if res and p[0]<= res[-1][1]: res[-1][1]=max(ans[-1][1], p[1])else:# 这是第一个区间 或者 新来的区间和之前的区间没有交集 res.append(p)return res 

三、189. 轮转数组

在这里插入图片描述
  • 思路:这道题可以推公式出来,如果不想推的话直接根据结果反转。注意不要使用切片或者列表的insert语法。这都会产生额外的空间
  • 代码1:
classSolution:defrotate(self, nums: List[int], k:int)->None:defreverse(i, j):while i < j: nums[i], nums[j]= nums[j], nums[i] i +=1 j -=1 n =len(nums) k %= n # 防止k比数组大 reverse(0, n-1) reverse(0, k-1) reverse(k, n-1)
  • 代码2:使用python自带的reverse语法
defrotate2(self, nums: List[int], k:int)->None:# python也有自带的reverse语法 n =len(nums) k %= n nums.reverse() nums[:k]=reversed(nums[:k]) nums[k:]=reversed(nums[k:])

四、238. 除自身以外数组的乘积

在这里插入图片描述
  • 思路:前后缀分解。维护一个pre[i]:表示0到i-1的乘积,suf[i]表示i+1到n-1的乘积。
  • 代码
classSolution:defproductExceptSelf(self, nums: List[int])-> List[int]: n =len(nums) pre =[1]*n for i inrange(1, n): pre[i]= pre[i-1]* nums[i-1] suf =[1]*n for i inrange(n-2,-1,-1): suf[i]= suf[i+1]* nums[i+1]return[p * s for p, s inzip(pre, suf)]

五、41. 缺失的第一个正数

在这里插入图片描述
  • 思路:将每个数字放到自己值对应的索引上
  • 代码:
classSolution:deffirstMissingPositive(self, nums: List[int])->int: n =len(nums)for i inrange(n):# 当前数字大小在列表范围内且没有放到对应的索引位置上。while1<= nums[i]<= n and nums[nums[i]-1]!= nums[i]: nums[nums[i]-1], nums[i]= nums[i], nums[nums[i]-1]for i inrange(n):if nums[i]!= i +1:return i +1# 如果都对上了return n +1

Read more

Python数据统计完全指南:从入门到实战

Python数据统计完全指南:从入门到实战

文章目录 * 1. 数据统计基础与环境配置 * 1.1 Python数据科学生态系统 * 1.2 环境配置与安装 * 2. 数据获取与加载 * 2.1 从不同数据源加载数据 * 2.2 数据基本信息查看 * 3. 数据清洗与预处理 * 3.1 缺失值处理 * 3.2 数据转换与编码 * 4. 描述性统计分析 * 4.1 基本统计量计算 * 4.2 高级统计分析 1. 数据统计基础与环境配置 1.1 Python数据科学生态系统 Python在数据统计领域的强大主要得益于其丰富的库生态系统: # 核心数据分析库import pandas as pd import numpy as np # 数据可视化库import matplotlib.pyplot

By Ne0inhk
Python入门:Python3 Pickle模块全面学习教程

Python入门:Python3 Pickle模块全面学习教程

Python入门:Python3 Pickle模块全面学习教程 Python入门:Python3 Pickle模块全面学习教程,本文详细介绍 Python Pickle 模块的核心知识与应用。Pickle 是 Python 标准库中用于对象序列化与反序列化的工具,可将列表、字典、类实例等对象转为字节流实现持久化存储或网络传输,再将字节流还原为原对象。文中先讲解其核心方法,包括用于文件操作的dump()与load()、用于字节串操作的dumps()与loads(),并结合实例展示文件存储和字节串传输两种场景的使用。还介绍自定义对象序列化的实现方式,通过__getstate__()和__setstate__()方法自定义逻辑。同时阐述 Pickle 协议版本的差异与选择,强调安全性、兼容性、性能方面的注意事项,对比 Pickle 与 JSON 的适用场景,助力开发者根据需求正确使用 Pickle 模块提升数据处理效率。 前言     Python作为一门简洁、易读、功能强大的编程语言,其基础语法是入门学习的核心。掌握好基础语法,

By Ne0inhk
OpenClaw 都在排队养,你还在云端白嫖?手把手教你用 Python 搭建本地 AI 智能体(小白也能养自己的小龙虾)

OpenClaw 都在排队养,你还在云端白嫖?手把手教你用 Python 搭建本地 AI 智能体(小白也能养自己的小龙虾)

🦞 长文警告! 📜 文章目录(点击跳转,这波操作稳如老狗) 1. 前言:别再当云端 AI 的韭菜了,把“小龙虾”养在自己家 2. 第一步:给电脑装个“胃”——下载安装 Python(含官网地址) 3. 第二步:请个本地“大脑”——Ollama + Qwen 模型(白嫖党狂喜) 4. 第三步:搭个“龙虾笼子”——安装 OpenClaw(附项目地址) 5. 第四步:用 Python 写个“传话筒”,让你的小龙虾听你指挥 6. 第五步:第一次对话——你的本地贾维斯上线 7. 总结:白嫖虽好,但别让龙虾把你的电脑“钳”

By Ne0inhk