tomoebzk

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

day2

Leetcode 209

滑动窗口,需要注意的地方是在每次循环之中更新length答案,当满足和大于等于target时开始更新length,left每次累加都会更新length,直到和小于target

while(s>=target)
            {
                length=min(length,right-left);
                s-=nums[left];
                left++;
            }

滑动窗口和双指针其实是同一个东西,灵茶山艾府将双指针作为滑动窗口的一个子节。,在每次right变化时更新和,每次left更新时更新和。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int s= 0, left = 0,right=0;
        int length=INT_MAX;
        
        for (auto num:nums) 
        {
            s+=num;
            
            right++;
            while(s>=target)
            {
                length=min(length,right-left);
                s-=nums[left];
                left++;
            }
        }
        return length<=nums.size()?length:0;
    }
};

Leetcode 59 螺旋矩阵Ⅱ

之前没有做过螺旋矩阵的题,刚开始的思路是找每一行之间的关系,通过遍历来进行赋值,但是思路陷入了死循环,找不到突破口,看了解答后才明白,通过每个大外圈的循环来进行遍历

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<int>temp(n,0);
        vector<vector<int>> ans(n,temp);
        int loop=n/2;//循环次数
        int mid=n/2;
        int startx=0;
        int starty=0;
        int offset=1;
        int num=1;
        int i=0;
        int j=0;
        while(loop--)
        {
            i=startx;
            j=starty;
            for(j;j<n-offset;++j)
            {
                ans[i][j]=num;
                num++;
            }
            for(i;i<n-offset;++i)
            {
                ans[i][j]=num;
                num++;
            }
            for(;j>starty;j--)
            {
                ans[i][j]=num;
                num++;
            }
            for(;i>startx;i--)
            {
                ans[i][j]=num;
                num++;
            }

            offset+=1;
            startx++;
            starty++;

            
        }
        if(n%2)//如果n为奇数的话需要考虑中心的值
            {
                ans[mid][mid]=num;

            }
        return ans;
    }
};

本题明白思路以后,通过画图便于理解,每个行列循环要保持一致

Kamacoder 58 前缀和

前缀和讲解58. 区间和 | 代码随想录

第一次使用kamacoder的界面和leetcode不一样,看了答案才理解编码过程是什么


#include <iostream>
#include <vector>
using namespace std;
int main() {
    int n, a, b;
    cin >> n;
    vector<int> vec(n);
    vector<int> p(n);
    int presum = 0;
    for (int i = 0; i < n; i++) {
        cin >> vec[i];
        presum += vec[i];
        p[i] = presum;
    }

    while (cin >> a >> b) {
        int sum;
        if (a == 0) sum = p[b];
        else sum = p[b] - p[a - 1];
        cout << sum << endl;
    }
}

Kamacoder 44 开发商土地

第一反应就是暴力O(n^2)遍历,输入array过程中计算array总和,在经过一次行遍历与一次列遍历,每次遍历到n-1或者m-1时更新result

#include<iostream>
#include<vector>
#include<climits>
using namespace std;

int main()
{
    int n,m;
    
    int sum=0;
    int sumA=0;
    int sumB=0;
    vector<vector<int>>field(n,vector<int>(m,0));
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>field[i][j];
            sum+=field[i][j];
        }
    }
    int result=INT_MAX;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            sumA+=field[i][j];
            if(j==m-1)
            {
                sumB=abs(sum-sumA);
                result=min(result,abs(sumA-sumB));
            }
        }
    }
    sumA=0;sumB=0;
    for(int j=0;j<m;j++)
    {
        for(int i=0;i<n;i++)
        {
            sumA+=field[i][j];
            if(i==n-1)
            {
                sumB=abs(sum-sumA);
                result=min(result,abs(sumA-sumB));
            }
        }
    }


    cout<<result<<endl;


}
posted on 2026-01-15 21:13  broderk  阅读(8)  评论(0)    收藏  举报