草庐IT

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

syseptember 2024-01-21 原文

文章目录

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;
}

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

  1. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  2. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  3. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  4. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  5. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  6. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  7. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  8. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  9. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  10. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

随机推荐