代码随想录算法训练营第二天|LeetCode 977.有序数组的平方 、209.长度最小的子数组 、59.螺旋矩阵II

7 篇文章 0 订阅
7 篇文章 0 订阅

LeetCode 977.有序数组的平方

题目链接:977.有序数组的平方

思路:
1、先对每个数进行遍历平方,并插入新的容器中
2、对容器进行排序,返回就可以了

缺陷:开辟了新的容器空间

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> v;
        for (int i = 0; i < nums.size(); i++) {
            v.push_back(pow(nums[i],2));
        }
        sort(v.begin(), v.end());
        return v;
    }
};

在这里插入图片描述
思路:
写此博客的过程中,突然想到我为什么还要重新开辟容器空间,直接在原数据上进行操作不就好了嘛,然后直接改了代码,这就没有额外的内存消耗了。
1、直接对原数据进行平方并进行替换
2、对容器进行排序,返回就可以了

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for (int i = 0; i < nums.size(); i++) {
            nums[i] = pow(nums[i],2);
        }
        sort(nums.begin(), nums.end());
        return nums;
    }
};

在这里插入图片描述

LeetCode 209.长度最小的子数组

题目链接:209.长度最小的子数组

解法一:暴力(不考虑超时)

以下代码为暴力方法,for循环里面嵌套一个for循环进行搜索,却只通过了17个测试用例,后面一直超时错误,也没想到其他方法,就看了别人的方法,在后面。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        vector<int> v;
        int x,y;
        int sum2 = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] >= target) {
                v.push_back(1);
            }
        }
        for (int i = 0; i < nums.size()-1; i++) {
            int sum = nums[i];
            for (int j = i+1; j < nums.size(); j++) {
                sum += nums[j];
                if (sum >= target) {
                    x = i;
                    y = j;
                    int sub = y-x+1;
                    v.push_back(sub);
                    break;
                }
            }
        }
        if (v.empty()) {
            v.push_back(0);
        }
        sort(v.begin(),v.end());
        return v[0];
    }
};

在这里插入图片描述
在这里插入图片描述

官方的暴力更简便点,但都一个思路,我写的冗余点,但官方暴力还是无法AC。
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size();
        if ( n == 0) {
            return 0;
        }
        int ans = INT_MAX;
        for (int i = 0; i < n; i++) {
            int sum = 0;
            for (int j = i; j < n; j++) {
                sum += nums[j];
                if (sum >= target) {
                    ans = min(ans, j-i+1);
                    break;
                }
            }

        }
        return ans == INT_MAX ? 0 : ans;
    }
};

在这里插入图片描述

解法二:滑动窗口

思路:不断的调节子序列的起始位置和终止位置,假如先设置起始位置,其思想和暴力没什么区别,所以得先设置终止位置。
1、设置j为终止位置指针,不断往后遍历,直到大于等于target的位置
2、滑动起始位置,往后移动一位(这时候窗口内的和会减去之前起始的一位,由于减去的这个数的值不知道大小,所以可能减去还是会大于等于target,所以要用while进行判断),然后不断进行更新判断就行
在这里插入图片描述

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int ans = INT32_MAX;
        int sum = 0;
        int i = 0;
        for(int j = 0; j < nums.size(); j++){
            sum += nums[j];
            while(sum >= target) {
                ans = min(ans, j-i+1);
                sum = sum - nums[i];
                i++;
            }
        }
        return ans == INT_MAX ? 0 : ans;
    }
};

在这里插入图片描述

LeetCode 59.螺旋矩阵II

题目链接:59.螺旋矩阵II

思路:按照螺旋的规律,对矩阵进行填充,先填外圈,再填内圈,直到最里面
根据下图可有效得到:
1、先判断要填几圈,也就是最外层的for循环要走多少次。
2、每一圈填充时,每次都走该圈的边长减1
即,走4X4最外圈时,每次都走3步,走里圈2X2时,每次都走1步。
走5X5最外圈时,每次都走4步,走里圈3X3时,每次都走2步,最后还剩下一个。
3、由于每圈的走法都是一样的,都分为四次,所以只需要写一圈的的走法就可以
设定四个指针变量,方便到内圈的时候也适用。
第一次走,横坐标不变(为heng),纵坐标从zong走到zong_wei - 1;
第二次走,纵坐标不变(为zong_wei),横坐标从heng走到heng_wei - 1;
第三次走,横坐标不变(为heng_wei),纵坐标从zong_wei走到zong + 1;
第四次走,纵坐标不变(为zong),横坐标从heng_wei走到heng + 1;
执行完,对zong++;zong_wei–;heng++;heng_wei–;即可进入下一圈。

注意:特殊奇数螺旋矩阵的时候,最里面一圈只填入一个,当zong和zong_wei都指向最中间时(heng和heng_wei也指向最中间)插入完,会再对它们进行++和–操作,这时候会报错,所以这时候需要判断以下。

4、走完输出即可。

4X4的螺旋矩阵

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> v(n, vector<int>(n));
        int heng = 0;
        int heng_wei = n-1; 
        int zong = 0;
        int zong_wei = n-1;
        int k = n/2;
        int m = 1;
        if (n == 1){
            v[0][0] = 1;
        }
        else{
            for (int j = 0; j <= k-1; j++) {
                for (int i = zong; i <= zong_wei-1; i++) {
                    v[heng][i] = m;
                    m ++;
                }
                for (int i = heng; i <= heng_wei-1; i++) {
                    v[i][zong_wei] = m;
                    m ++;
                }
                for (int i = zong_wei; i >= zong + 1; i--) {
                    v[heng_wei][i] = m;
                    m ++;
                }
                for (int i = heng_wei; i >= heng + 1; i--) {
                    v[i][zong] = m;
                    m ++;
                }
                heng ++;
                heng_wei --;
                zong ++;
                zong_wei --;
                if (heng == heng_wei){
                v[heng][heng] = m;
                }
            }
        }
        return v;
    }
};

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第二十二天的算法训练主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小的数组

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值