代码随想录算法训练营17期day02-python

一、有序数组的平方leetcode.977,
给你一个按非递减顺序排序的整数数组nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
【双指针法】
#用nums接收键盘输入的字符串
nums = input().split()
#定义一个空列表
list = []
for i in nums:
    #将input输入的数据转换为列表,并将元素转换为int类型
    list.append(int(i))
#定义函数
def getarr(nums):
    #左指针为左边界,右指针为右边界
    left = 0
    right = len(nums) - 1
    #定义一个新数组,长度与原数组相同,因为是非递减顺序,所以下标k从-1开始(也可以从len(num)-1开始)
    k = -1
    arr = [0] * len(nums)
    #开始遍历,左闭右闭
    while left <= right:
        #将左右指针对应的元素平方中较大值放入结果列表arr中,对应的指针向中间移动,即right--或left++(每次循环只执行二者中的一个)
        if nums[left] ** 2 < nums[right] ** 2:
            arr[k] = nums[right] ** 2
            right -= 1
        else:
            arr[k] = nums[left] ** 2
            left += 1
        #结果数组的下标前移,因为每次循环总有数据进入,所以每次都要k--
        k -= 1
    return arr

print(getarr(list))
二、长度最小的子数组,leetcode209
给定一个含有 n个正整数的数组和一个正整数s,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,
并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。

【双指针法】
# 用nums接收键盘输入的字符串
nums = input().split()
target = int(input())
# 定义一个空列表
list = []
for i in nums:
    # 将input输入的数据转换为列表,并将元素转换为int类型,以便后续对元素进行数学运算
    list.append(int(i))

#定义函数
def getlen(nums, target):
    #定义快慢指针,初始值均为0
    slow, fast = 0, 0
    #初始化累加值
    sum = 0
    #初始化元素的个数为无穷大
    count = float('inf')
    #外层循环,边界左闭右闭
    while fast < len(nums):
        #累加值为快指针遍历的元素之和
        sum += nums[fast]
        #内层循环为判定条件,当累计值大于等于目标值时,开始内层循环
        while sum >= target:
            #元素个数为快慢指针间的元素个数与原个数之间的最小值
            count = min(count, fast - slow + 1)
            #此种情况下,累加值减去窗口内的第一个元素,即慢指针对应的元素
            sum -= nums[slow]
            #慢指针相应后移
            slow += 1
        #快指针为外层循环的条件,无论如何均向后移
        fast += 1
    return count
#此解法看似两层循环,实则遍历两次,并不是真正的两层循环,所以时间复杂度为O(2n)

print(getlen(list,target))

三、leetcod.059螺旋矩阵

num = int(input())

def getmatrix(num):  # 定义函数获取螺旋矩阵
    start_x, start_y = 0, 0  # 初始化行数和列数
    arr = [[0] * num for _ in range(num)]
    loop = num // 2  # 定义转圈的总次数,总次数为整数nums对2取商
    count = 1  # 初始化数字,从1开始
    ringcount = 1  # 初始化圈数,开始时为1
    while ringcount <= loop:  # 外循环为螺旋转圈,圈数从1开始,循环条件为<=loop
        # 从左向右遍历(矩阵的上边),将最后一位留给下一步的遍历,区间为左闭右开,所以此处边界条件为nums-ringcount,下同;
        for i in range(start_y, num - ringcount):
            arr[start_x][i] = count
            count += 1
        #从上到下遍历(矩阵的右边)
        for j in range(start_x, num - ringcount):
            arr[j][num - ringcount] = count
            count += 1
        # 从右向左遍历(矩阵的下边),遍历顺序从右向左,顺序为-1
        for i in range(num - ringcount, start_y, -1):
            arr[num - ringcount][i] = count
            count += 1
        # 从下向上遍历(矩阵的下边),遍历顺序从下向上,顺序为-1
        for j in range(num - ringcount, start_x, -1):
            arr[j][start_y] = count
            count += 1
        start_x += 1
        start_y += 1
        ringcount += 1
    #当num为奇数时,遍历完成时螺旋矩阵中心的位置就是最终的count值
    if (num % 2) != 0:
        arr[start_x][start_y] = count
    for i in range(num):
        print(arr[i])

getmatrix(num)

2023-6-29打卡第一天,加油,贵在坚持,每天进步一点就好

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值