Leetcode刷题day2-数组

发布时间 2023-12-01 16:36:11作者: 智障学Leetcode

977有序数组的平方

977. 有序数组的平方 - 力扣(LeetCode)
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:

  • 输入:nums = [-4,-1,0,3,10]
  • 输出:[0,1,9,16,100]
  • 解释:平方后,数组变为 [16,1,0,9,100]
  • 排序后,数组变为 [0,1,9,16,100]
    示例 2:
  • 输入:nums = [-7,-3,2,3,11]
  • 输出:[4,9,9,49,121]

解题思路
1. 暴力求解:map对list元素求平方,转list后,sorted
2. 双指针:构建与nums等长列表res,left,right指针分别指向nums首尾,对比收尾元素平方值,将较大值填入res尾部,其res尾部指针前移一位

import copy
class Solution():
	# 暴力求解
	def sortedSquares(nums):
		a = sorted(list(map(lambda x: pow(x,2),nums)))
        return a
	
	# 双指针     
	def sortedSquares(self,nums):
		left,right = 0, len(nums)-1
		res = copy.deepcopy(nums)
		for k in range(len(nums)-1,-1,-1):
			if nums[left]**2 > nums[right]**2:
				res[k] = nums[left]**2
				left += 1
			else:
				res[k] = nums[right]**2
				right -= 1
		return res

    def sortedSquares(self,nums):
        left,right,k = 0,len(nums)-1,len(nums)-1
        res = copy.deepcopy(nums)
        while left<=right:
            if nums[left]**2 > nums[right]**2:
                res[k]=nums[left]**2
                left += 1
            else:
                res[k]=nums[right]**2
                right -= 1
            k -= 1
        return res

209.长度最小的子数组

209. 长度最小的子数组 - 力扣(LeetCode)
给定一个含有 n 个正整数的数组和一个正整数 target
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。
示例 1:

  • 输入:target = 7, nums = [2,3,1,2,4,3]
    输出:2
    解释:子数组 [4,3] 是该条件下的长度最小的子数组。
    示例 2:
    输入:target = 4, nums = [1,4,4]
    输出:1
    示例 3:
    输入:target = 11, nums = [1,1,1,1,1,1,1,1]
    输出:0

解题思路
1. 暴力求解:双层循环,每层额外判断当前元素是否>target,满足return 1
2. 滑动窗口:构建快慢指针,快指针先走,元素和 $res>target$ 时,快指针停止移动,慢指针逐步前移直到 $res<target$ , 在此过程计算length

class Solution():
	def minSubArrayLen(target,nums):
		slow,length,res = 0,float("inf"),0
        for fast in range(len(nums)):
            res += nums[fast]
            while res>=target:
                length = min(length,fast-slow+1)
                res -= nums[slow]
                slow += 1
        return 0 if length==float("inf") else length

59.螺旋矩阵Ⅱ

59. 螺旋矩阵 II - 力扣(LeetCode)
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:

  • 输入:n = 3
  • 输出:[[1,2,3],[8,9,4],[7,6,5]]
    示例 2:
  • 输入:n = 1
  • 输出:[[1]]
    解题思路
    设定循环轮数:loop=n//2(转圈数)
    设定右边界缺失数:offset(左闭右开)
    设定行、列起始值:start_x,start_y
    从左到右(column<n-offset)、从上到下(row<n-offset)、从右到左(column>start_y)、从下到上(row>start_y)依次循环
    n为奇数时中心点为n*n
class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        nums = [[0]*n for _ in range(n)]
        loop = n//2
        start_x,start_y = 0,0
        count,offset = 1,1
        while loop:
            row,column=start_x,start_y
            while column<n-offset:  # 从左到右
                nums[row][column]=count
                count+=1
                column+=1
            while row<n-offset:  # 从上到下
                nums[row][column]=count
                count+=1
                row+=1
            offset += 1

            while column>start_y:  # 从右到左
                nums[row][column]=count
                count+=1
                column-=1
            start_y+=1
            while row>start_x:  # 从下到上
                nums[row][column]=count
                count+=1
                row-=1
            start_x+=1
            loop-=1
        if n%2:
            nums[n//2][n//2]=count
        return nums