算法训练营打卡Day2

题目1.

209.长度最小的子数组

先谈谈我的思路(先尝试用python,写在注解中)但是很快就卡壳了,没有接触过滑动窗口,然后看了视频讲解,链接如下:

class Solution(object):

    def minSubArrayLen(self, target, nums):

        """

        :type target: int

        :type nums: List[int]

        :rtype: int

        """

        #可以尝试双指针的思路

        #快指针先遍历整个数组

        n = len(nums)

        slow,fast = 0,0

        while slow <= n-1 and slow < fast:

            for i in range(slow+1,n):

                #快指针从慢指针所指的前一个元素开始遍历,直到最后一个元素

                if nums[slow] + nums[fast] == target:

                    return fast - slow + 1

                #如果本轮遍历中未找到两个数之和为目标值的两个数

                #就要考虑三个以上的数之和

                elif (nums[slow]+nums[fast]!=target) and (fast==n-1) and (slow==n-1):

......

接下来是改善思路后的代码,但是运行时间超出限制了(哭哭),最后还是参考了其他大佬的解法

class Solution(object):

    def minSubArrayLen(self, target, nums):

        #思路转变为双指针滑动窗口

        i,j = 0,0

        n = len(nums)

        ans = 0

        #j作为快指针,需要最先遍历到数组中最后一个元素(索引值为n-1)

        while j < n:

            #使用切片求和

            #如果当前窗口的所有数总和小于目标值,我们就移动快指针,扩大区间

            #如果当前窗口的所有数总和大于目标值,我们就移动慢指针,缩小区间

            if sum(nums[i:j+1]) < target:

                j += 1

                temp = j - i + 1

                if temp < ans:

                    ans = temp

            elif sum(nums[i:j+1]) > target:

                i += 1

                temp = j - i + 1

                if temp < ans:

                    ans = temp

            elif sum(nums[i:j+1]) == target:

                ans = j - i + 1

            else:

                return 0

        return ans


#C

代码如下:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX; // 最终的结果
        int sum = 0; // 子序列的数值之和
        int subLength = 0; // 子序列的长度
        for (int i = 0; i < nums.size(); i++) { // 设置子序列起点为i
            sum = 0;
            for (int j = i; j < nums.size(); j++) { // 设置子序列终止位置为j
                sum += nums[j];
                if (sum >= s) { // 一旦发现子序列和超过了s,更新result
                    subLength = j - i + 1; // 取子序列的长度
                    result = result < subLength ? result : subLength;
                    break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
                }
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};
时间复杂度:O(n^2) ;空间复杂度:O(1)

#python

class Solution(object):

    def minSubArrayLen(self, target, nums):

        if nums is None or len(nums)==0:

            return 0

        lenf=len(nums)+1

        total=0

        i=j=0

        while (j<len(nums)):

            total=total+nums[j]

            j+=1

            while (total>=target):

                lenf=min(lenf,j-i)

                total=total-nums[i]

                i+=1

        if lenf==len(nums)+1:

            return 0

        else:

            return lenf

作者:代码随想录
链接:https://leetcode.cn/problems/minimum-size-subarray-sum/solutions/1706223/by-carlsun-2-iiee/

题目2.

59.螺旋矩阵 II

#python解法

先写思路:

  1. 初始化一个 n×n 的零矩阵。
  2. 定义四个边界变量:leftrighttopbottom 分别表示当前要填充的行的起始和结束位置,以及列的起始和结束位置。
  3. 使用一个变量 num 来追踪当前要填充的数字,初始化为 1。
  4. 当 num 小于等于 n2 时,执行以下循环:先从左到右填充上边行(top 行),更新 left 和 num。然后从上到下填充最右边的列(right 列),更新 top 和 num。接着从右到左填充下边行(bottom 行),更新 right 和 num。紧接着从下到上填充最左边的列(left 列),更新 bottom 和 num。最后,在每次填充完一行或一列后,要检查是否已经填满了整个矩阵(即 num 是否已经等于 n2)

 def generateMatrix(n):

if n == 0:

   return [ ]

# 初始化矩阵

matrix = [[0] * n for _ in range(n)]

left, right, top, bottom = 0, n - 1, 0, n - 1

num = 1

while num <= n * n:

# 从左到右填充上边行

         for j in range(left, right + 1):

              matrix[top][j] = num num += 1 top += 1

              # 检查是否已填满

              if num > n * n:

                 break

                 # 从上到下填充最右边的列

          for i in range(top, bottom + 1):

               matrix[i][right] = num

               num += 1

               right -= 1

               # 检查是否已填满

               if num > n * n:

                  break

               # 从右到左填充下边行

               for j in range(right, left - 1, -1):

                    matrix[bottom][j] = num

                    num += 1

                    bottom -= 1

                    # 检查是否已填满

                    if num > n * n:

                       break

                    # 从下到上填充最左边的列

                 for i in range(bottom, top - 1, -1):

                      matrix[i][left] = num

                      num += 1

                      left += 1

                      return matrix

#C  滑动窗口

遇到的问题;代码中一开始有几个问题和缺失的部分,包括未定义的变量(如 numsij),未正确处理n为奇数时循环结构的情况,以及没有分配内存给返回的矩阵。此外,''while(n/2) ''这个循环条件可能不会如期望地那样工作,因为它在 n 为奇数时也会执行多次,而不仅仅是一次(除非 n 正好是 2 的幂)。

int main() {  

    int n = 3;  

    int returnSize;  

    int* returnColumnSizes;  

    int** matrix = generateMatrix(n, &returnSize, &returnColumnSizes);  

    // 打印矩阵  

    for (int i = 0; i < returnSize; i++) {  

        for (int j = 0; j < returnColumnSizes[i]; j++) {  

            printf("%d ", matrix[i][j]);  

        }  

        printf("\n");  

    }  

    // 释放内存  

    for (int i = 0; i < returnSize; i++) {  

        free(matrix[i]);  

    }  

    free(matrix);  

    free(returnColumnSizes);  

    return 0;  

}

总结,这是两道对个人而言比较有挑战性的题目,都是在看完题目没有思路的情况下看完视频讲解才解答的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值