主要例题与代码源于微信公众号:代码随想录
一些题的答案源于LeetCode题解区

1数组

1.1二分法–35

暴力法

def insert(nums,t):for i in range(len(nums)):if nums[i] >= t:return i

**有序数组 ** 是二分查找的基础条件。

循环不变量

以下为 二分法的两种写法

def insert(nums,t):l,r=0,len(nums-1)while l<=r: #取等时,区间仍有定义mid=l+(l+r)//2 #(取整,防止溢出)if nums[mid]>t:r=mid-1 #表明t在左区间elif nums[mid]<t:l=mid+1 #t在右区间else:return mid
def insert(nums,t):l,r=0,len(nums-1)while l<r:mid=l+(l+r)//2if nums[mid]>t:r=midelif nums[mid]<t:l=mid+1else:return mid

1.2移除元素–15

暴力法 有问题 跑不出来?

def removeElement(nums,t):n=len(nums)for i in range(n):if nums[i]==t:#发现要移除的元素,将数组集体向前移动一位for j in range(i+1,n-1):nums[j-1]=nums[j]i-=1n-=1return n

双指针法

def removeElement(nums,t):n=len(nums)p1,p2=0,0for p1 in range(n):if nums[p1]!=t:nums[p2]=nums[p1]p2+=1return p2

例题l15

#l15三数之和
def threeSum(nums):n=len(nums)res=[]if (not nums or n<3):return []nums.sort()#排序,使用双指针#三次for循环复杂度过高,于是使用单for+双指针for i in range(n):if (nums[i]>0):#因为已经排序好,所以后面不可能有三个数加和等于0,直接返回结果。return resif (i>0 and nums[i]==nums[i-1]):continue#跳过重复解l=i+1r=n-1while l<r:if (nums[i]+nums[l]+nums[r]==0):res.append([nums[i],nums[l],nums[r]])while (l<r and nums[l]==nums[l+1]):#判断断左界和右界是否和下一位置重复,去除重复解。l+=1while (l<r and nums[r]==nums[r-1]):r-=1l+=1r-=1elif(nums[i]+nums[l]+nums[r]>0):r-=1else:l+=1return res

1.3滑动窗口–209

暴力法 --超时

class Solution:def minSubArrayLen(self, s: int, nums: List[int]) -> int:rl=[]if not nums:return 0for i in range(len(nums)):res=0for j in range(i,len(nums)):res+=nums[j]if res>=s:rl.append(j-i+1)if rl:return min(rl)else:return 0

滑动窗口 --可看做双指针的特例

class Solution:def minSubArrayLen(self, s: int, nums: List[int]) -> int:n=len(nums)p=0res=0rl=[]if not nums:return 0for i in range(n):res+=nums[i]while res>=s:rl.append(i-p+1)res-=nums[p]p+=1if rl:return min(rl)else:return 0

1.4螺旋矩阵–59

「本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。」

class Solution:def generateMatrix(self, n: int) -> [[int]]:l, r, t, b = 0, n - 1, 0, n - 1mat = [[0 for _ in range(n)] for _ in range(n)]num, tar = 1, n * nwhile num <= tar:for i in range(l, r + 1): # left to rightmat[t][i] = numnum += 1t += 1for i in range(t, b + 1): # top to bottommat[i][r] = numnum += 1r -= 1for i in range(r, l - 1, -1): # right to leftmat[b][i] = numnum += 1b -= 1for i in range(b, t - 1, -1): # bottom to topmat[i][l] = numnum += 1l += 1return mat

Python列表切片妙解

class Solution:def generateMatrix(self, n: int) -> List[List[int]]:def rotation(matrix):return list(zip(*matrix[::-1]))r,n=[[n*n]],n*nwhile n>1:new=[list(range(n-len(r),n))]rot = rotation(r)n-=len(r)r=new+rotreturn r
class Solution:def generateMatrix(self, n: int) -> List[List[int]]:r, n = [[n**2]], n**2while n > 1: n, r = n - len(r), [[*range(n - len(r), n)]] + [*zip(*r[::-1])]return r

1.5数组总结

「数组是存放在连续内存空间上的相同类型数据的集合。」

【算法学习笔记】寒假打卡1——数组相关推荐

  1. 数据结构与算法学习笔记之 从0编号的数组

    数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...

  2. 算法学习笔记:网络流#4——ISAP 求解最大流

    算法学习笔记:网络流#4--ISAP 求解最大流 1. 前言 2. 模板 2.1 详解 2.2 正确性证明 2.3 代码 3. 算法对比 3.1 一般数据下的对比 3.2 特殊数据下的对比 4. 总结 ...

  3. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  4. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  5. 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序

    拓扑排序是对DAG(有向无环图)上的节点进行排序,使得对于每一条有向边 , 都在 之前出现.简单地说,是在不破坏节点 先后顺序的前提下,把DAG拉成一条链.如果以游戏中的科技树(虽然名字带树,其实常常 ...

  6. 数据结构与算法学习笔记之 提高读取性能的链表(上)

    数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...

  7. l2-004 这是二叉搜索树吗?_算法学习笔记(45): 二叉搜索树

    二叉搜索树(Binary Search Tree, BST)是一种常用的数据结构,在理想情况下,它可以以 的复杂度完成一系列修改和查询,包括: 插入一个数 删除一个数 查询某数的排名(排名定义为比该数 ...

  8. 两个字符串的最长公共子序列长度_算法学习笔记(58): 最长公共子序列

    (为什么都更了这么多篇笔记了,这时候才讲这么基础的内容呢?因为我本来以为LCS这种简单的DP不用讲的,结果CF不久前考了LCS的变式,然后我发现由于自己对LCS一点都不熟,居然写不出来 ,于是决定还是 ...

  9. 数据结构与算法学习笔记4:递归+分治法

    数据结构与算法学习笔记4 递归 斐波那契数列 青蛙跳台阶问题 链表倒序打印 分治法 二分查找/折半查找 Binary Search 题目1:快速幂 题目2:如何判断一个数是否为2的次幂 递归 指在函数 ...

最新文章

  1. mysql db.opt+ (frm,MYD,MYI)备份与还原数据库
  2. 《深度学习的数学》二刷总结
  3. 青海高考成绩查询日期2021,2021年青海高考成绩什么时候出来 公布时间
  4. Android 原生通知Notification 写法
  5. 超越提升和迁移 充分利用云计算的七种方法
  6. 要记住的Facepalm:我在未先测试SDK的情况下对其进行了改进。
  7. Python列表基础
  8. android java adb命令大全,Android adb命令备份恢复手机信息
  9. mysql的日志迁移到mango_mysql 向mongo迁移备忘
  10. Python正在褪色,最晚2030年就被淘汰
  11. 【flink】Flink 1.12.2 源码浅析 : Task 浅析
  12. BitMap 的基本原理和实现
  13. 矩池云安装利用pip、apt、conda安装需要的包
  14. (二十二)访问者模式详解(伪动态双分派)
  15. 网络基础之冲突域和广播域
  16. 优酷 Android 包瘦身治理思路全解
  17. 计算机系统包括哪些郜分,一台计算机的基本硬件配置有哪些?
  18. Spring错误——Spring 注解——factory-bean reference points back to the same bean definition
  19. 一款强大的红队信息收集和资产收集工具(Kscan)
  20. 概率论:均值、方差与协方差矩阵

热门文章

  1. seo编辑内容优化的苦恼:文章该多长才最适合
  2. 移动手机网站的用户设计需求
  3. %格式化和format格式化--python
  4. 天天生鲜项目——项目立项
  5. 快手2020校园招聘秋招笔试--工程A试卷 (编程题题解全)
  6. 中国公司债券第一单07长电公司债周一正式发行
  7. LAMP(一)_介绍
  8. Java方法的分类及使用
  9. 2021-02-18-ctf-坚持60s-反编译
  10. Xilinx K7_Microblaze的Tmrintc定时器中断使用(ISE14.7)