(一)数论

目的:将各种算法例题重新理解一遍,加油。(语言:Python)
如果友友们想要查看例题详细解析和其他语言版本代码—> 《代码随想录》

二分查找

1.给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target 。
 写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

输入: nums = [-1,0,3,5,9,12], target = 9     
输出: 4       
解释: 9 出现在 nums 中并且下标为 4
def main(lst,target):
    left, right = 0, len(lst)
    while left <= right:          #(左闭右闭)
        mid = (left+right)//2
        if lst[mid] < target:     #在mid右边,意味着要收紧left
            left = mid + 1
        elif lst[mid] > target:   #在mid左边,意味着要收紧right
            right = mid - 1
        else:
            return mid       
    return -1

lst = [-1,0,3,5,9,12]
target = 2
result = main(lst,target)
print(result)
#nums = [-1,0,3,5,9,12],result = 4
#nums = [-1,0,3,5,9,12],result = 2

有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回每个数字的平方组成的新数组,
要求也按 非递减顺序 排序。

输入:nums = [-4,-1,0,3,10] 
输出:[0,1,9,16,100] 
解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]
def main(lst):
    ans = [0] * len(lst)           # 初始化
    left, right = 0, len(lst) - 1  # 设置双指针下标
    ans_index = len(lst) - 1       # 输出结果是升序,所以每次将大的数从后往前放置
    while left <= right:
        l_num = lst[left] ** 2
        r_num = lst[right] ** 2
        if l_num < r_num:
            ans[ans_index] = r_num
            right -= 1
        else:
            ans[ans_index] = l_num
            left += 1
        ans_index -= 1
    return ans

lst = [-4, -1, 0, 2, 3, 10]
result = main(lst)
print(result)
#nums = [-4,-1,0,3,10],result = [0,1,9,16,100]
#nums = [-7,-3,2,3,11],result = [4,9,9,49,121]

长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 s,找出该数组中满足其和 ≥ s 
的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回0。

输入:s = 7, nums = [2,3,1,2,4,3] 
输出:2 
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
def main(lst,target):
    sum,l = 0,len(lst)+1
    left,right = 0,0
    while right < len(lst):
        sum += lst[right]         #每次都尝试去往后加一个数
        right += 1
        while sum >= target:      #只要>=target,就尝试去找最小的数组长度
            l = min(l,right-left) #如果能找到更小的就更新l
            sum -= lst[left]
            left += 1
    if l == len(lst)+1:         #如果整个数组加起来<target,返回None
        return 0
    else:
        return l

lst = [2,3,1,2,4,3]
target = 7
result = main(lst,target)
print(result)
#target = 7, nums = [2,3,1,2,4,3],result = 2

螺旋矩阵II

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

输入: 3 
输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
def main(n):
    lst = [[0 for _ in range(n)] for _ in range(n)]    #初始化列表
    loop,mid = n//2,n//2        #转圈数,中心点(当n为奇数时需要)
    start_x,start_y = 0,0       #第一圈外壳的起点初始化
    count = 1
    for offset in range(1,loop+1):         #每画一个外壳,偏移量+1,往里缩一圈。
        for i in range(start_y,n-offset):  #每一条边都遵循左闭右开原则
            lst[start_x][i] = count
            count += 1
        for j in range(start_x,n-offset):  #看清楚每一行或列变的是什么就填for里面,也注意从哪到哪(方向)
            lst[j][n-offset] = count       #不变的先写(注意是start_x,还是n-offset),再把变的填上
            count += 1
        for k in range(n-offset,start_y,-1):
            lst[n-offset][k] = count
            count += 1
        for l in range(n - offset,start_x,-1):
            lst[l][start_y] = count
            count += 1
        start_x += 1                       #为下一个外壳转圈圈做准备
        start_y += 1
    if n % 2 != 0:                         #如果是奇数边长,就要自己添加中心点
        lst[mid][mid] = n**2
    return lst

n = 3
result = main(n)
print(result)
#n = 3,result = [[1, 2, 3], [8, 9, 4], [7, 6, 5]]
#n = 4,result = [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]

免责声明:本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除。
原文作者:作者 卡哥:链接: 代码随想录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值