代码随想录Day-2| Leetcode #977 有序数组的平方| #209 长度最小的子数组| #59 螺旋矩阵II

#977 有序数组的平方

1. 题目:

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

2. 思路:

        借用双指针思想,对比左右两指针所指数的平方,将平方较大的数的那一方先放入新数组,并移动至下一个数,再进行比较。(草图)

代码随想录Day-2| Leetcode #977 有序数组的平方| #209 长度最小的子数组| #59 螺旋矩阵II_第1张图片

 3. 代码实现

        res = [0] * len(nums)
        left = 0
        right = len(nums) - 1
        for i in range(len(nums)):
            res_left = nums[left] ** 2
            res_right = nums[right] ** 2
            if res_left > res_right:
                res[-1-i] = res_left
                left += 1
            if res_left <= res_right:
                res[-1-i] = res_right
                right -= 1
        return res

4.复盘

        第一次运行代码时,未考虑边界条件 res_left == res_right,添加后AC

#209 长度最小的子数组

1. 题目:

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

2. 思路:

       需找到满足和>=target的连续子数组。依旧使用双指针思路,一个指针正常遍历数组(for循环),当数组和大于等于target时,移动左指针并依次减去左指针数,找到符合的最小连续子数组。在这里增加一个变量min_length 用于记录每一次 达到要求的子数组长度。由于无法预测left指针移动多少次才不满足条件,因此使用while 循环来完成条件(sum_result >= target)的判断。

3. 代码实现:

        start = 0
        min_len = float('inf') 
        # 将初始min_len设为无穷大,若for循环结束 res < target, 返回0
        res = 0
        for end in range(len(nums)):
            res += nums[end]
            while res >= target:
                min_len = min(min_len, end - start + 1)
                res -= nums[start]
                start += 1
        
        return min_len if min_len != float('inf') else 0

4.复盘

        首次运行时,未考虑min_len = float('inf')情况, 在结尾增加判断条件 AC

#59 螺旋矩阵II

1. 题目:

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

2. 思路:代码随想录Day-2| Leetcode #977 有序数组的平方| #209 长度最小的子数组| #59 螺旋矩阵II_第2张图片

3. 代码实现:

        res = [[0] * n for _ in range(n)]
        count = 0
        start_x = 0
        start_y = 0
        loop = n // 2
        for offset in range(1,loop + 1):
            for i in range(start_x,n - offset):
                count += 1
                res[start_x][i] = count
            for i in range(start_y, n - offset):
                count += 1
                res[i][n - offset] = count
            for i in range(n - offset,start_x,-1):
                count += 1
                res[n - offset][i] = count
            for i in range(n - offset,start_y,-1):
                count += 1
                res[i][start_x] = count
            start_x += 1
            start_y += 1
        center = (n - 1)//2
        if n % 2 != 0:
            res[center][center] = count + 1
        return res

 4. 复盘

        初次创建res list时使用指令为, 运行后出错。 该指令的意思是 创造n个含0的list并复制n次。

res = [[0] * n] * n

你可能感兴趣的:(leetcode)