代码随想录【数组】----->有序数组的平方、长度最小的子数组、螺旋矩阵

这篇具有很好参考价值的文章主要介绍了代码随想录【数组】----->有序数组的平方、长度最小的子数组、螺旋矩阵。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

977.有序数组的平方

题目LeetCode977. 有序数组的平方
代码随想录【数组】----->有序数组的平方、长度最小的子数组、螺旋矩阵

双指针思路

由于平方后两边的元素最大,中间的元素最小,所以可以使用双指针。

  • 定义left指向原数组最左边,right指向原数组最右边
  • 比较left元素的平方和right元素的平方
  • left元素平方大于right元素平方,将left元素平方放在结果集最后,left++
  • right元素平方大于left元素平方,将right元素平方放在结果集最后,right–

代码随想录【数组】----->有序数组的平方、长度最小的子数组、螺旋矩阵

代码

int* sortedSquares(int* nums, int numsSize, int* returnSize){
    int left = 0;
    int right = numsSize - 1;
    int* res = (int*)malloc(sizeof(int) * numsSize);
    *returnSize = 0;
    //数组平方
    for (int i = 0; i < numsSize; i++)
    nums[i] *= nums[i];
    while (left <= right)
    {
        if (nums[left] > nums[right]) 
        res[numsSize - 1 - (*returnSize)++] = nums[left++];
        else 
        res[numsSize - 1 - (*returnSize)++] = nums[right--];
    }
    return res;
}

代码随想录【数组】----->有序数组的平方、长度最小的子数组、螺旋矩阵


209.长度最小的子数组

题目:LeetCode209. 长度最小的子数组
代码随想录【数组】----->有序数组的平方、长度最小的子数组、螺旋矩阵

暴力解法

这道题目暴力解法当然是 两个for循环,然后从整个数组头不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2)。

int minSubArrayLen(int target, int* nums, int numsSize) {
    //暴力:
    int subSum = 0;//记录子串和
    int sublen = 0;//记录子串长度
    int res = INT_MAX;
    for (int i = 0; i < numsSize; i++)//循环变量记录子串头
    {
        subSum  = 0;//每一次子串头更新时字串和更新为0
        for (int j = i; j < numsSize; j++)//循环变量记录子串尾
        {
            subSum += nums[j];
            if (subSum >= target)//子串和超过目标值
            {
                sublen = j - i + 1;//统计子串长度
                res = res < sublen ? res : sublen;//记录最短字串长度
                break;//找到最短长度后直接break
            }
        }
    }
    //最短字串长度没有改变的话说明不存在子数组满足条件
    return res == INT_MAX ? 0 : res;
}

滑动窗口⭐️

滑动窗口,就是不断条件子串的起始位置和结束位置,从而得出我们想要的结果。
暴力解法中使用了两层for循环,而滑动窗口只使用一层for循环完成了两层循环所做的事,所以请思考滑动窗口的一层for循环中的循环变量代表着什么?循环变量代表的是窗口(子串)的尾点

  • 如果循环变量代表的是起始点,那么我们仍然需要一个循环变量来记录窗口的尾点,这样的做法就和暴力解法一样需要另外一层for循环寻找窗口的尾点
  • 如果循环变量表示窗口的尾点,那么我们只需要一个变量记录窗口的起始点,滑动窗口的关键问题就是如何变化窗口的起始点

问题就是如何表示滑动窗口的起始位置?
这里还是以题目中的示例来举例,s=7, 数组是 2,3,1,2,4,3,来看一下查找的过程

代码随想录【数组】----->有序数组的平方、长度最小的子数组、螺旋矩阵

最后找到3 4是最短子串

这个思路的关键三个点就是

  1. 什么是窗口?
  2. 如何移动窗口的起始位置
  3. 如何移动窗口的终止位置?
  • 窗口就是满足元素之和大于等于target的子串
  • 当窗口的值大于等于target时窗口的起始位置向每次后移动一格
  • 当窗口的值小于target时窗口的终止位置向后移动一格
 int minSubArrayLen(int target, int* nums, int numsSize) {
    //滑动窗口
    int subSum = 0;//记录子串和
    int res = INT_MAX;
    int sublen = 0;//记录子串长度
    int i = 0;//记录滑动窗口起始位置
    for (int j = 0; j < numsSize; j++)//循环变量是滑动窗口结束位置
    {
        subSum += nums[j];//统计子串和
        //子串和大于等于target
        while (subSum >= target)
        {
            sublen = j - i + 1;//字串长度
            subSum -= nums[i];//字串和减去窗口当前起始位置的值
              i++;//窗口起始位置向前滑动一个位置
            res = res < sublen ? res : sublen;//记录最小字串长度
        }
    }
    return res == INT_MAX ? 0 : res;//res没变表示不存在这样的子串
}

代码随想录【数组】----->有序数组的平方、长度最小的子数组、螺旋矩阵


59.螺旋矩阵

题目LeetCode59. 螺旋矩阵 II
代码随想录【数组】----->有序数组的平方、长度最小的子数组、螺旋矩阵

思路

很容易观察到矩阵的值是随着每一圈而增加的,所以我们可以外面一个大的循环表示循环的圈数,至于每一圈怎么处理是我们要讨论的重点

  • 每一圈可以分为4个方向,左到右、上到下、右到左、下到上
  • 每一个方向处理的数据不能有重复

我们可以通过每次处理一个方向的数据是左闭右开的来保证每个方向处理到的数据不会有重复,而我们在处理过程中是一定要执行这个左闭右开的原则,这就是循环不变量
代码随想录【数组】----->有序数组的平方、长度最小的子数组、螺旋矩阵

代码

int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
      //初始化返回的结果数组的大小
    *returnSize = n;
    *returnColumnSizes = (int*)malloc(sizeof(int) * n);
    //初始化返回结果数组ans
    int** martix = (int**)malloc(sizeof(int*) * n);
    int i;
    for(i = 0; i < n; i++) {
        martix[i] = (int*)malloc(sizeof(int) * n);
        (*returnColumnSizes)[i] = n;
    }
   int loop = n / 2;//循环loop圈
   int curNum = 1;//当前填充值
    for (int count = 0; count < loop; count++)
      {
          //初始化一圈的开始坐标
          int i = count, j = count;
        //保持左闭右开的原则从左向右赋值
        for ( ; j < n - 1 - count; j++) martix[i][j] = curNum++;
        //保持左闭右开的原则从上向下赋值
        for ( ; i < n - 1 - count; i++) martix[i][j] = curNum++;
        //保持左闭右开的元组从右向左赋值
        for ( ; j > count; j--)         martix[i][j] = curNum++;
        //保持左闭右开的原则从下向上赋值
        for ( ; i > count; i--)         martix[i][j] = curNum++;
      }
      //填充奇数圈正中间的值
      if (n % 2 == 1) martix[loop][loop] = curNum++;
      return martix;
}

代码随想录【数组】----->有序数组的平方、长度最小的子数组、螺旋矩阵文章来源地址https://www.toymoban.com/news/detail-426449.html

到了这里,关于代码随想录【数组】----->有序数组的平方、长度最小的子数组、螺旋矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [自我记录]随想录刷题第二天 | 977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

     代码随想录打卡第二天, 新手自我记录一下刷题历程, 仅为自我打卡使用. 今天刷了三道主题, 第一道双指针和第三道模拟做出来了, 第二道写出了暴力解法但是提交leetcode超时了, 测试用例过了18/20, 看了carl哥答案以后自己重新补写了滑动窗口方法. 977. 有序数组的平方 简单题

    2024年02月05日
    浏览(43)
  • 【代码随想录-Leetcode第六题:209. 长度最小的子数组】

    给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 参考【代码随想录】 示例 1: 示例 3: 提示: 1 = target = 109 1 = nums.length

    2024年02月12日
    浏览(39)
  • 有序数组的平方 长度最小的子数组 螺旋矩阵II

    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] 示例

    2024年02月12日
    浏览(44)
  • 算法-有序数组的平方,长度最小的子数组,螺旋矩阵II

    伪装成一个老手! 题目 给你一个按 非递减顺序 排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。 示例 : 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100] 来源:力扣977 思路 遍

    2024年02月11日
    浏览(41)
  • 算法训练第二天|977.有序数组的平方、209.长度最小的有序数组、59.螺旋矩阵2

    题目链接:力扣 思路:同样使用双指针的方法,这样就可以只遍历一次原数组。 可以考虑需要按照一个顺序来遍历,那就是从大到小或者从小到大,我选择的是从大到小。 不难看出,原数组将每个数平方后,呈现从两边到中间逐渐减小的规律。 所以使用一个指针指向原数组

    2023年04月22日
    浏览(54)
  • 第23天-代码随想录刷题训练-第六章 ● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

    - LeetCode 链接 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。 修剪树不应该改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在唯一的答案

    2024年02月05日
    浏览(37)
  • 有序数组的平方、长度最小的子数组、螺旋矩阵II(Day2)

    题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/ 第一反应暴力如上代码 下面写一段用双指针思想的代码 题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/ 本题暴力解法会超时,以下采用滑动窗口的方式(将暴力的两个for循环变成一个) 题目链接:https://leetcode.cn/

    2023年04月26日
    浏览(39)
  • Day 2 数组:977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵Ⅱ

    977.有序数组的平方 题目链接 💡思路 暴力解法 将数组内每个数平方每个数平方之后,按升序排序 代码如下: 时间复杂度: O (   n l o g n ) O( nlogn) O (   n l o g n ) 空间复杂度: O ( 1 ) O(1) O ( 1 ) 时间复杂度具体分析: for循环: O(n) 快速排序 : O(nlogn) 因此时间复杂度是 O (  

    2024年02月10日
    浏览(49)
  • LeetCode977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    LeetCode977.有序数组的平方 思路:         双指针应用         因为数组是有序的,数组中可能存在负数,所以其平方的最大值只可能是数组的头或尾,因此可以定义两个指针,i指向头,j指向尾。同时定义一个新数组result,让k指向新数组的最后一个元素,当nums[i] * nums[i]

    2023年04月21日
    浏览(43)
  • Day02 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II

    https://leetcode.cn/problems/squares-of-a-sorted-array/ 时间复杂度O(n) https://leetcode.cn/problems/minimum-size-subarray-sum/ 时间复杂度:O(n) 看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。 空间复杂度

    2023年04月18日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包