Leetcode刷题Day2 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II

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

#新数组也要求按非递减顺序排序,那么最大值为nums两端值的平方
class Solution:
    def sortedSquares(self, nums: list[int]) -> list[int]:
        n = len(nums)-1
        l = 0
        r = n
        result = [0]*(n+1)
        for i in range(len(nums)):
            #比较nums两端值平方的大小
            if nums[l]**2 >= nums[r]**2:
                result[n-i] = nums[l]**2
                l += 1
            else:
                result[n-i] = nums[r]**2
                r -= 1
        return result
#暴力解法(全算出来再去排序)
class Solution:
    def sortedSquares(self, nums: list[int]) -> list[int]:
    	result = [0]*(len(nums))
    	for i in range(len(nums)):
    		result[i] = nums[i]**2
    	return sorted (result)

209.长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0.

#双指针法,先计算第一个指针到什么地方时(即j=?),sum>target,再移动第二个指针,看当前的和,即sum-nums[i],不断对比j-i+1的大小(一定要记得加一),再取符合条件的最小值
class Solution:
    def minSubArrayLen(self, target: int, nums: list[int]) -> int:
	    res = float("inf")
	    Sum = 0
	    i = 0
	    for j in range(len(nums)):
	    	Sum = Sum + nums[j]
	    	while Sum >= target:
	    		res = min(res, j-i+1) #这里记得要+1
	    		Sum = Sum - nums[i]
	    		i +=1
	    	renturn 0 if res == float("inf") else res

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

class Solution:
    def generateMatrix(self, n: int) -> list[list[int]]:
    	nums = [[0] * n for _ in range(n)] 
    	startx = 0 #开始的行数
    	starty = 0 #开始的列数
    	loop = n // 2 #循环的次数
    	mid = n // 2 #判断有无中间点
    	count = 0 #计数
    	for i in range (loop-1): #开始一圈一圈循环
    		for j in range (starty,n-i): #j的变化范围为该行列数的取值
    			nums[startx][j] = count
    			#从上左到上右,行数不变,为startx,列数变化:starty——n-i,每循环一圈stary+1,i+1
    			count +=1
    		for j in range (startx,n-i): #j的变化范围为该列行数的取值
    			nums[j][n-i] = count
    			#从右上到右下,列数不变,为n-i,行数变化:startx——n-i,每循环一圈starx+1,i+1
    			count +=1
    		for j in range (n-i,starty,-1): #j的变化范围为该行列数的取值
    			nums[n-i][j] = count
    			#从下右到下左,行数不变,为n-i,列数变化:starty——n-i逆向,每循环一圈stary+1,i+1
    			count += 1
    		for j in range (n-i,startx,-1): #j的变化范围为该列行数的取值
    			nums[j][starty] = count
    			#从左下到左上,列数不变,为i,行数变化:startx——n-i逆向,每循环一圈starx+1,i+1
    			count += 1
   			startx += 1  #更新起始点
   			starty += 1
		if n % 2 != 0 :			# n为奇数时,填充中心点
            nums[mid][mid] = count
        return nums
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值