leetcode 3.5

普通数组

1.最大子数组和

最大子数组和
前缀和pre + 动态规划
pre保留的是当前包含了当前遍历的最大的前缀和,如果之前的pre 对结果有增益效果,则 pre 保留并加上当前遍历, 如果pre 对结果无增益效果,需要舍弃,则 pre 直接更新为当前遍历数字;
每次比较 pre 和 maxAns的大小,将最大值置为maxAns,遍历结束返回结果。
时间复杂度:O(n)

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n = nums.size();
        if (n == 1) return nums[0];
        int pre = 0, maxAns = nums[0];
        for (int i = 0; i < n; i++) {
            pre = max(pre + nums[i], nums[i]);
            maxAns = max(maxAns, pre);
        }
        return maxAns;
    }
};

普通数组

1.除自身以外数组的乘积

前缀和 * 后缀和
前缀和 = 前一个元素 * 前两个元素前缀和
用一个遍历来跟踪右边元素的乘积。并更新数组 answer[i]=answer[i]∗R。然后 R 更新为 R=R∗nums[i],其中变量 R 表示的就是索引右侧数字的乘积。

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> ans(n, 1);
        int pre = 1, back = 1;
        for (int i = 1; i < n; i++) {
            ans[i] *= nums[i - 1] * ans[i - 1];
        }
        for (int i = n - 2; i >= 0; i--) {
            back *= nums[i + 1];
            ans[i] *= back;
        }
        return ans;
    }
};

矩阵

1.矩阵置零

矩阵置零
先用两个for记录出现0的行和列,再用两个for去标记出现0的所有行列元素
时间复杂度:O(mn),其中 mmm 是矩阵的行数,nnn 是矩阵的列数。我们至多只需要遍历该矩阵两次。
空间复杂度:O(m+n),其中 mmm 是矩阵的行数,nnn 是矩阵的列数。我们需要分别记录每一行或每一列是否有零出现。

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int n = matrix.size();
        int m = matrix[0].size();
        vector<int> row(n, 0), col(m, 0);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (matrix[i][j] == 0)
                    row[i] = col[j] = 1; 
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (row[i] || col[j])
                    matrix[i][j] = 0;
            }
        }
    }
};

2.螺旋矩阵

可以将矩阵看成若干层,首先输出最外层的元素,其次输出次外层的元素,直到输出最内层的元素。
在这里插入图片描述

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int n = matrix.size();
        int m = matrix[0].size();
        vector<int> ans;
        int u = 0, d = n - 1;
        int l = 0, r = m - 1;
        while (true) {
            //左->右
            for (int i = l; i <= r; i++) {
                ans.push_back(matrix[u][i]);
            }
            u++;
            if (u > d) break;

            //上->下
            for (int i = u; i <= d; i++) {
                ans.push_back(matrix[i][r]);
            }
            r--;
            if(r < l) break;

            //右->左
            for (int i = r; i >= l; i--) {
                ans.push_back(matrix[d][i]);
            }
            d--;
            if(d < u) break;

            //下->上
            for (int i = d; i >= u; i--) {
                ans.push_back(matrix[i][l]);
            }
            l++;
            if(l > r) break;
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值