自己的算法记录 | Day2 数组Part02

LeetCode 977.有序数组的平方

题目链接
题目描述:给你一个按 非递减顺序 排序的整数数组 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]
#算法公开课

解题思路:

  • 首先看到第一个想法应该是用暴力排序,先将每个数的平方组出来再调用sorded来排序。
  • 不过有更好的方法是用到双指针法,不过要考虑的是会有负数,所以可以看出来当所有数都乘与平方后,最大的数会在数组的两边,所以我们可以采用前后指针来解。
第一种解法(暴力排序):
class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        for i in range(0,len(nums)):
            nums[i] *= nums[i]
        nums = sorted(nums)
        return nums
第二种解法(双指针法):
class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        # result = [0] * len(nums)# 定义一个列表来存放新的数组
        result = [float('inf')] * len(nums)# 这个写法第一次知道,里面的inf是代表正无穷

        i,j,k = 0,len(nums)-1,len(nums)-1
        while(i <= j):
            if nums[i] ** 2 < nums[j] **2:
                result[k] = nums[j]**2
                j -= 1
            else:
                result[k] = nums[i]**2
                i+=1
            k -= 1

        return result

体会:挖个坑,周六补回来。

LeetCode 209.长度最小的子数组

题目链接

题目描述:给定一个含有 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

解题思路:

  • 首先是暴力推的话肯定能想到是用双层循环来遍历整个数组并把所有组合的可能性给推出来之后再比较,不过这样现在通过不了leetcode提交了,复杂度太高。
  • 滑动窗口法,这是今天学到的一种思路,又是用到了双指针,第一步都在头,然后将终止指针遍历列表,而起始指针则一步一步更新找到最小的组合。
第一种解法(暴力排序):
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        l = len(nums)# 数组长度
        min_len = float('inf')# 初始化一个正无穷的变量接收最小长度
        for i in range(l): # 外层循环是遍历了整段原数组
            cur_sum = 0 # 接收目前最短的
            for j in range(i,l):
                cur_sum += nums[j]
                if cur_sum >= target:
                    min_len = min(min_len,j-i+1) # +1是因为下标+1等于数组长度
                    break
        return min_len if min_len != float('inf') else 0
第二种解法(滑动窗口):
class Solution():
    def minSubArrayLen(self,target:int,nums:List[int])->int:
        size = len(nums)
        left = 0 # 起始指针
        right = 0# 终止指针,在外循环
        min_len = float('inf')
        cur_sum = 0 # 当前添加值

        while right < size:# 终止指针需要遍历整个列表
            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

体会:挖个坑,周六补回来。

挖坑第三题59. 螺旋矩阵 II,周六回来补。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值