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

部署运行你感兴趣的模型镜像

主要例题与代码源于微信公众号:代码随想录
一些题的答案源于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)//2
        if nums[mid]>t:
            r=mid
        elif nums[mid]<t:
            l=mid+1
        else:
            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-=1
            n-=1
    return n

双指针法

def removeElement(nums,t):
    n=len(nums)
    p1,p2=0,0
    for p1 in range(n):
        if nums[p1]!=t:
            nums[p2]=nums[p1]
            p2+=1
    return 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 res
        if (i>0 and nums[i]==nums[i-1]):
            continue#跳过重复解
        l=i+1
        r=n-1
        while 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+=1
                while (l<r and nums[r]==nums[r-1]):
                    r-=1
                l+=1
                r-=1
            elif(nums[i]+nums[l]+nums[r]>0):
                r-=1
            else:
                l+=1
    return res

1.3滑动窗口–209

暴力法 --超时

class Solution:
    def minSubArrayLen(self, s: int, nums: List[int]) -> int:
        rl=[]
        if not nums:
            return 0
        for i in range(len(nums)):
            res=0
            for 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=0
        res=0
        rl=[]
        if not nums:
            return 0
        for i in range(n):
            res+=nums[i]

            while res>=s:
                rl.append(i-p+1)
                res-=nums[p]
                p+=1
        if 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 - 1
        mat = [[0 for _ in range(n)] for _ in range(n)]
        num, tar = 1, n * n
        while num <= tar:
            for i in range(l, r + 1): # left to right
                mat[t][i] = num
                num += 1
            t += 1
            for i in range(t, b + 1): # top to bottom
                mat[i][r] = num
                num += 1
            r -= 1
            for i in range(r, l - 1, -1): # right to left
                mat[b][i] = num
                num += 1
            b -= 1
            for i in range(b, t - 1, -1): # bottom to top
                mat[i][l] = num
                num += 1
            l += 1
        return 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*n
        while n>1:
            new=[list(range(n-len(r),n))]
            rot = rotation(r)
            n-=len(r)
            r=new+rot
        return r
class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        r, n = [[n**2]], n**2
        while n > 1: n, r = n - len(r), [[*range(n - len(r), n)]] + [*zip(*r[::-1])]
        return r

1.5数组总结

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

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值