代码营打卡 Day2

1.有序数组的平方(977)

1.1双指针法

一个包含负数的有序排列的数组,其平方的最大值一定是在数组的左右两边

所以用两个指针i 和 j, 分别指向数组的首和尾,比较首尾两个数字哪个平方更大,将大的那个写入新数组res之中, 由于要求新数组按照从小到大排列,所以按照由大到小的顺序排入新数组

如果是i边大, 那么将i对应大平方值写入序列号为k的res中,i ++且k--

如果是j边大,那么将j对应较大的平方值写入序号为k的res中, j-- 且 k--

这里要注意:

1. 初始res的方法 res = [float('inf')] * len(nums)

2. while循环时需要包含i = j这种情况, 否则i = j不会被写入res中,和题目意思不符合

        res = [float('inf')] * len(nums) # 需要提前定义列表,存放结果
        k = len(nums) - 1
        j = k
        i = 0
        while i <= j:
            if nums[i] * nums[i] > nums[j] * nums[j]:
                res[k] = nums[i] * nums[i]
                k -= 1
                i += 1
            else:
                res[k] = nums[j] * nums[j]
                k -= 1
                j -= 1
        return res

2.长度最小子数组(209)

2.1 暴力解法

固定开始位置, 依次循环终止位置, 遇到符合条件的就计算数组长度, 选出最小的数组长度并且记录

这里注意当我们已经找到了以当前 i 为起始位置的最短子数组, 继续循环只会找到更长的子数组,所以用break跳出内层循环,重新确定开始位置,找开始位置为起点的最短数组

        l = len(nums)
        min_len = float('inf')
        for i in range (l):
            sum1 = 0
            for j in range (i, l):
                sum1 += nums[j]
                if sum1 >= target:
                    min_len = min(min_len, j-i+1)
                    break
        return min_len if min_len != float('inf') else 0

2.2滑动窗口

滑动窗口即是固定终止位置, 移动起始位置

集合中所有元素和>=s后, 固定终止位置, 移动起始位置(left), 看总的sum减去left所在元素值以后是否仍然大于等于s. 以此来找到最短的符合条件的集合

这里编程时自己遇到的小问题是 right += 1是写在判断s之后的, 因为如果去掉一个left仍然满足大于s, 则right不需要任何移动

        left = 0
        right = 0
        l = len(nums)
        cur_sum = 0
        min_len = float('inf')

        while(right < l):
            cur_sum += nums[right]

            while(cur_sum >= target):
                min_len = min(min_len, right-left+1)
                cur_sum -= nums[left]
                left += 1
            right += 1
        return min_len if min_len != float('inf') else 0

3.螺旋矩阵(59)

螺旋矩阵重要的是循环不变量,即循环一圈,对每条边的处理规则不变,这道题以左闭右开为例,横向为y轴,纵向为x轴

遵循只处理第一个,最后一个节点留给下一个循环处理的原则,作为下调变的起始位置. 并且用offset来记录终止位置,起始位置每圈也变化.

另外注意当n为奇数的时候,最后一个中间位置会空出,将最后一个值给它即可

这里用python语言实现还有几点注意

1. 初始化矩阵的时候,用这个代码 nums = [[0]*n for _ in range(n)]

2. 当从后往前循环的时候记得加上-1

3. 用一个loop变量计算循环次数,控制第一层循环

        nums = [[0]*n for _ in range(n)]
        startx = 0 
        starty = 0
        loop = n//2
        mid = n//2
        count = 1

        for offset in range(1, loop+1):
            for i in range(starty, n - offset):
                nums[startx][i] = count
                count += 1
            for i in range(startx, n-offset):
                nums[i][n - offset] = count
                count += 1
            for i in range(n-offset, starty, -1):
                nums[n-offset][i] = count
                count += 1
            for i in range(n-offset, startx, -1):
                nums[i][starty] = count
                count += 1

            startx += 1
            starty += 1
            offset += 1

        if n % 2 != 0:
            nums[mid][mid] = count
        return nums

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值