力扣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

滑动窗口算法:从零到精通,一文搞定所有套路!+ LeetCode高频考点:滑动窗口算法详解与解题模板

“面试官让我找出字符串中最长无重复子串,我用了两层循环,O(n²)的时间复杂度,面试官摇了摇头。然后他问:‘知道滑动窗口吗?’——那一刻我才明白,我与大厂offer之间,只差一个滑动窗口的距离。” 滑动窗口(Sliding Window),这个听起来有些神秘的名字,其实是解决数组/字符串子区间问题的利器。无论是字节跳动高频出现的“最小覆盖子串”,还是腾讯常考的“长度最小的子数组”,滑动窗口都能以O(n)的时间复杂度优雅解决。今天,我就带你从零开始,彻底掌握这个让算法面试变简单的核心技巧! 1. 为什么要学滑动窗口?(解决痛点) 先看一个经典问题 LeetCode 209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target。 找出该数组中满足其和 ≥ target 的长度最小的连续子数组,并返回其长度。 输入:target = 7, nums = [2,3,1,2,

By Ne0inhk
【算法通关指南:算法基础篇】二分算法: 1.A-B 数对 2.烦恼的高考志愿

【算法通关指南:算法基础篇】二分算法: 1.A-B 数对 2.烦恼的高考志愿

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人等方向学习者 ❄️个人专栏:《C语言》《【初阶】数据结构与算法》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、A-B 数对 * 1.1题目 * 1.2 算法原理 * 1.3代码 * 二、烦恼的高考志愿 * 2.1 题目 * 2.2 算法原理 * 2.3 代码 * 总结与每日励志 前言 本文将通过两道经典二分查找例题 ——A-B 数对与烦恼的高考志愿,带你系统掌握二分查找的核心思想与实用技巧。从排序预处理到lower_bound、upper_bound的灵活运用,再到手动实现二分与边界细节处理,由浅入深讲解算法原理与代码实现,帮助你快速攻克二分查找题型,提升编程思维与解题效率 一、

By Ne0inhk
java面试这一篇就够了(干货)

java面试这一篇就够了(干货)

前言 一、基础篇 1.1.Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高) 3、与平台无关性(JVM是Java跨平台使用的根本) 4、可靠安全 5、支持多线程 1.2.面向对象和面向过程的区别 面向过程:是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,然后在使用的时候一一调用则可。性能较高,所以单片机、嵌入式开发等一般采用面向过程开发,以函数为单位,一步一步完成,后期出现问题 可能会牵一发而动全身. 面向对象:以对象为最小单位是把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事物在解决整个问题的过程中所发生的行为。面向对象有封装、继承、多态的特性,所以易维护、易复用、易扩展。可以设计出低耦合的系统。 但是性能上来说,比面向过程要低。 1.3.

By Ne0inhk
【笔记】在 Windows 上安装 Python-vLLM

【笔记】在 Windows 上安装 Python-vLLM

SystemPanic/vllm-windows:用于 LLM(Windows 构建和内核)的高吞吐量和内存效率推理和服务引擎 在 Windows 上安装 vLLM 有两种方式,分别是通过已发布的 wheel 包安装和从源码构建安装,具体步骤如下: 一、通过现有发布的 wheel 包安装(推荐) 发布 v0.11.0 ·SystemPanic/vllm-windows vllm-0.11.0+cu124-cp312-cp312-win_amd64.whl 1. 确认版本兼容性 确保你的 Python、PyTorch 和 CUDA 版本与 wheel 包要求一致(版本信息会在发布版本中注明)。 2. 下载 wheel 包 从 最新发布页面

By Ne0inhk