代码随想录DAY2(数组02)

第一题:977.有序数组的平方

方一:先全部平方再用sort排序

方二:双指针

因为是已经排好序的,想想冒泡排序,是一次外循环确定最大的元素放到这层的最右边,这里的话就是最大的只可能在最左边和最右边,那么就用两个指针,i,j,平方后大的那个就放到新开辟的数组result里面,然后更新一下这个指针,注意这时另一指针不变,最后这两个指针相等后再放一个值进去,再退出循环即可

class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        int k = A.size() - 1;
        vector<int> result(A.size(), 0);
        for (int i = 0, j = A.size() - 1; i <= j;) {
            if (A[i] * A[i] < A[j] * A[j])  {
                result[k--] = A[j] * A[j];
                j--;
            }
            else {
                result[k--] = A[i] * A[i];
                i++;
            }
        }
        return result;
    }
};

第二题:209.长度最小的子数组

题目易错点:注意此题对子字符串的描述是nums[j],nums[j+1],nums[j+2]是这种连着的数组

是要大于等于s,没说等于

方法一:暴力解

 1.知识:INT_MAX与INT_MIN

参看链接:CSDN编程社区

2.代码:这样的话时间复杂度是O(n^2)超出了时间限制,但是这个代码任然有值得学习的地方:

①判断数组是否为空

②比较大小用的INT_MAX

③int sum=0定义在第一层for循环,在第二层for循环j从i开始

④ans的取值用min函数

⑤最后return如果没有合适的子数组就说明ans还是INT_MAX,返回0,否则直接返回ans写的也很到位

class Solution {
public:
    int minSubArrayLen(int s, 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 >= s) {
                    ans = min(ans, j - i + 1);
                    break;
                }
            }
        }
        return ans == INT_MAX ? 0 : ans;
    }
};

  方法二:双指针,滑动窗口

这个还挺有意思的,其实能够满足和>=s的子数组就这么些,其实就是一些滑动窗口

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

第三题:59.螺旋矩阵II

这是leetcoe一位大佬的解法,在此膜拜:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int t = 0;      // top
        int b = n-1;    // bottom
        int l = 0;      // left
        int r = n-1;    // right
        vector<vector<int>> ans(n,vector<int>(n));
        int k=1;
        while(k<=n*n){
            for(int i=l;i<=r;++i,++k) ans[t][i] = k;
            ++t;
            for(int i=t;i<=b;++i,++k) ans[i][r] = k;
            --r;
            for(int i=r;i>=l;--i,++k) ans[b][i] = k;
            --b;
            for(int i=b;i>=t;--i,++k) ans[i][l] = k;
            ++l;
        }
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值