代码随想录算法训练营第二天| 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋矩阵II。

第一题 有序数组的平方

题目描述:
  给你一个按非递减顺序 排序的整数数组 nums,返回每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
思路:
  比较简单的想法式先对每个数进行平方,在使用快速排序进行重新排序。但是原数组是有序的,负数的平方也有非常强的规律性,负数平方从右往左依次增大,正数从左往右依次增大,可以使用双指针进行操作可以有效降低时间复杂度。代码如下所示:

from typing import List

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
    	result = list(nums)

    	i, j = 0, len(nums)-1
    	k = len(nums)-1

    	while i <= j:
    		if nums[i] ** 2 > nums[j] ** 2:
    			result[k] = nums[i] ** 2
    			i += 1
    		else :
    			result[k] = nums[j] ** 2
    			j -= 1

    		k -= 1 

    	return result


if __name__ == '__main__':
    solution = Solution()
    nums =  [-4,-1,0,3,10]
    print(solution.sortedSquares(nums) )

第二题 长度最小的子数组

题目描述:
  给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
思路:
  这也是一道双指针应用习题,具体代码如下:

from typing import List
from math import inf

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
    	result = inf
    	i = 0
    	num_sum = 0

    	for j in range(len(nums)):
    		num_sum += nums[j]

    		while num_sum >= target:
    	 		result = min(result, j - i + 1)
    	 		num_sum -= nums[i]
    	 		i += 1

    	if result == inf:
    		return 0

    	return result

if __name__ == '__main__':
    solution = Solution()
    target = 7

    nums = [2,3,1,2,4,3]
    print( solution.minSubArrayLen(target, nums) )

第三题 螺旋矩阵II

题目描述:
  给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
思路:
  这道题考察对边界处理的判断,没有涉及其他编程知识,编程种始终遵循左闭右开原则即可,具体代码如下:

from typing import List

class Solution:
  def generateMatrix(self, n: int) -> List[List[int]]:
      startx, starty = 0, 0
      result = [ [0 for k in range(n)] for k in range(n)]
      offset = 1
      count = 1
      k = n // 2

      for index in range(k):

          for j in range(starty, n-offset):
              result[startx][j] = count
              count += 1

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

          for j in range(n-offset, starty, -1):
              result[n-offset][j] = count
              count += 1

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

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

      if n % 2 == 1:
          result[k][k] = count

      return result

if __name__ == '__main__':
  solution = Solution()
  print(solution.generateMatrix(4),sep='\n')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值