代码随想录算法训练营Day2(LeetCode209长度最小的子数组;LeetCode59螺旋矩阵II;卡码:区间和;卡码:开发商购买土地)

代码随想录算法训练营Day2(LeetCode209长度最小的子数组;LeetCode59螺旋矩阵II;卡码:区间和;卡码:开发商购买土地)

  • LeetCode209 长度最小的子数组
    • 做题情况
  • LeetCode59 螺旋矩阵II
    • 做题情况
  • 卡码 区间和
    • 做题情况
  • 卡码 开发商购买土地
    • 做题情况

LeetCode209 长度最小的子数组

题目链接:长度最小的子数组(https://leetcode.cn/problems/minimum-size-subarray-sum/description/)
文档讲解:代码随想录(https://programmercarl.com)

做题情况

想到了暴力解法,但是不能AC。想用双指针的解法,但是思路是从全部包含逐渐递减,这样不能得到最短的数组。接下来看了双指针解法的示意图,但是实现只是用了一个循环,实现起来复杂无比,难以实现,没有考虑到窗口收缩可能不止一次。总结下来,外层循环用于控制窗口终止位置 (重要!), 一次窗口扩展可能带来多次窗口收缩,因此需要内置一个while循环。另外,在实现的过程中思考了外置while是否需要考虑slow>fast 的情况,但是推导后发现没有影响。

下面是代码:

int minSubArrayLen(int target, vector<int>& nums) {
    int slow = 0, fast = 0, subLength = INT_MAX, sum = 0;
    while (fast < nums.size()) {
        sum += nums[fast];
        while(sum >= target) {
            subLength = min(subLength, fast - slow + 1);
            sum -= nums[slow];
            slow++;
        }
        fast++;
    }
    return (subLength == INT_MAX) ? 0 : subLength;
}

LeetCode59 螺旋矩阵II

题目链接:螺旋矩阵II(https://leetcode.cn/problems/spiral-matrix-ii/)
文档讲解:代码随想录(https://programmercarl.com)

做题情况

以前看到此类题目觉得很麻烦,认为是不是会有快速解答,稍微看了下题解说就是直接写,就写出来了。我这里用的是左闭右开,严格遵守就不难。注意一下 vector> res(n, vector(n, 0)) c++中二维数组初始化的方法。

以下是代码:

vector<vector<int>> generateMatrix(int n) {
    // 左闭右开
    vector<vector<int>> res(n, vector<int>(n, 0));
    int left = 0, right = n - 1, num = 1;
    while (left < right) {
        // 上方
        for (int i = left; i < right; i++)
            res[left][i] = num++;
        // 右方
        for (int i = left; i < right; i++)
            res[i][right] = num++;
        // 下方
        for (int i = right; i > left; i--)
            res[right][i] = num++;
        // 左方
        for (int i = right; i > left; i--)
            res[i][left] = num++;
        // 边界变更
        left++; right--;
    }
    if (left == right)
        res[left][right] = num++;
    return res;
}

卡码 区间和

题目链接:区间和(https://kamacoder.com/problempage.php?pid=1070)
文档讲解:代码随想录(https://programmercarl.com)

做题情况

这里复习了ACM输入。cin >> a >> b >> c 的返回值是cin本身的引用,比如该式等于 ((cin >> a) >> b) >> c ,可以重载为bool运算符,因此如果有输入就可以判断为 true

#include 
#include 

int main() 
{
    int n, a, b;
    std::cin >> n;
    std::vector<int> vec(n+1, 0);
    for (int i = 1; i <= n; i++) {
        std::cin >> vec[i];
        vec[i] += vec[i-1];
    }
    while (std::cin >> a >> b)
        std::cout << vec[b+1] - vec[a] << std::endl;
}

卡码 开发商购买土地

题目链接:开发商购买土地(https://kamacoder.com/problempage.php?pid=1044)
文档讲解:代码随想录(https://programmercarl.com)

做题情况

和上一题 前缀和 类似,需要注意实现细节,实现的时候老是出现小错误。

#include 
#include 
#include 

int main()
{
    int m, n, num, minGap = INT_MAX;
    std::cin >> n >> m;
    std::vector<int> rowVec(n, 0), columnVec(m, 0);
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++){
            std::cin >> num;
            columnVec[j] += num;
            rowVec[i] += num;
        }
    }
    for (int i = 1; i < n; i++)
        rowVec[i] += rowVec[i-1];
    for (int i = 0; i < n; i++)
        minGap = std::min(std::abs(rowVec[n-1] - 2*rowVec[i]), minGap);
    for (int j = 1; j < m; j++)
        columnVec[j] += columnVec[j-1];
    for (int j = 0; j < m; j++)
        minGap = std::min(std::abs(columnVec[m-1] - 2*columnVec[j]), minGap);
    std::cout << minGap << std::endl;
}

你可能感兴趣的:(leetcode,算法,矩阵,线性代数)