Python算法笔记1_双指针问题

基于《你也能看得懂的python算法书》。

"指针"是变成语言中的一个对象,用于存储一个内存空间的地址。双指针问题主要涉及:数组合并,二分查找,链表。

数组合并

举例:两个从小到大有序排列的数组如何合并为一个新的从小到大排列的数组。

思路如下:

  1. 固定arr1的值到ans
  2. 判断arr1是否为空,为空直接让ans接arr2(特殊情况判断)
  3. arr1不为空时,遍历arr2中的数,将其与arr1[ind]比较
  4. 若arr1[ind]较小,指针右移使得arr1[ind]变大,直到找到一个比arr2[i]大的arr1[ind],将arr2[i]插在arr1[ind]前
python 复制代码
arr1 = [1,3,4,6,10]
arr2 = [2,5,8,11]
ind = 0
ans = arr1.copy()    #ans初始化为arr1

for i in range(0,len(arr2)):    #左边右开区间
    while ind < len(arr1):    #终止条件:直到比较到arr1最后一个数,ind的范围不能超过数组元素下标的最大值
        if arr2[i] <= arr1[ind]:
            ans.insert(ind+i,arr2[i])    #向第一个数组中合适的位置插入第二个数组中的数
            break
        else:
            ind += 1    #如果ind指向的数比i指向的数小,指针右移
    else:    #arr1已经遍历完或者为空,直接将arr2拼到arr1结尾
        ans = ans + arr2[i:]
        break

注意:

其中的while循环的结束是因为while后面的判断语句(ind < len(arr1))的返回值是False,则执行else;如果是因为break跳出循环,则不执行else。

二分查找

二分查找又叫折半查找,意思是每次查找后,查找的范围都折半。

二分查找需要两个指针,一个指向数组的第一个元素,叫做头指针;另一个指向数组最后一个元素的后方,叫做尾指针。要查找的范围是在头指针和尾指针之间的所有元素(包括头指针指向的元素但不包括尾指针指向的元素)。

tips:如果只查找一个元素,尾指针为len(nums);如果查找两个元素,尾指针为(len(nums)-1)。

举例:在一个从小到大的有序数组中查找目标数字的指针。

python 复制代码
numbers = [1,3,5,6,7,8,13,14,15,17,18,24,30,43,56]
head,tail = 0,len(numbers)    #尾指针取到数组最后一个数的位置之后
search = int(input("Enter a number to search:"))

while head - tail < 1:    #当tail-head=1时,查找的范围只有head指向的数,因为尾指针指向的数取不到
    mid = (head+tail)//2    #mid存储中间数的下标
    if search < numbers[mid]:
        tail = mid    #search只会在mid左边出现且可能取到mid-1指向的数
    if search > numbers[mid]:
        head = mid + 1    #search只会在mid右边出现且取不到mid指向的数
    if search == numbers[mid]:
        ans = mid
        break
else:
    if search == numbers[head]:
        ans = head
    else:
        ans = -1    #如果数组中没有这个元素,直接输出-1
print(ans)

链表

链表是用指针连接的用于存储数据的数组,最大的优点在于可以有效利用零碎是内存空间。

输出一个由两个列表组成的单链表

python 复制代码
ListValue = [1,5,6,2,4,3]
ListPointer = [3,2,-1,5,1,4]    #链表最后一个指针为-1
head = 0    #head是指向链表的第一个元素的指针,需要自己定义
print(ListValue[head])    #直接输出第一个元素的值
next = ListPointer[head]    #给next赋初始值
while next != -1:    #next代表指向下一个元素的指针,不等于-1代表后面还有元素
    print(ListValue[next])    #输出下一个元素中存储的值
    next = ListPointer[next]    #把指针变为下一个元素中存储的指针
相关推荐
এ᭄画画的北北11 分钟前
力扣-208.实现Trie(前缀树)
算法·leetcode
mortimer17 分钟前
Python 启动太慢?可能是config模块需要优化了
python·llm·ipython
草莓熊Lotso18 分钟前
【数据结构初阶】--排序(四):归并排序
c语言·数据结构·经验分享·其他·算法·排序算法
北风toto19 分钟前
windos安装了python,但是cmd命令行找不到python
python
无规则ai32 分钟前
深度学习(pytorch版)前言:环境安装和书籍框架介绍
人工智能·pytorch·python·深度学习
max50060036 分钟前
基于最大似然估计的卡尔曼滤波与自适应模糊PID控制的单片机实现
数据库·python·单片机·深度学习·mongodb·机器学习·transformer
kang19191 小时前
Python 通过Playwright+OpenCV破解滑动验证码 实例
python·opencv·playwright
从零开始学习人工智能1 小时前
从Token到序列:阿里GSPO算法如何让大模型训练更稳、更强?
人工智能·算法·机器学习
给我个面子中不2 小时前
java回顾八股文中想起的知识点
java·开发语言·python
数据知道2 小时前
一文掌握Bard机器翻译,以及用python调用的4种方式(现已升级为 Gemini)
python·自然语言处理·bard·机器翻译·gemini