Day2 | 209.长度最小的子数组 59.螺旋矩阵II

80 阅读3分钟

209. 长度最小的子数组 - 力扣(LeetCode)

快指针遍历至末尾 慢指针在满足条件的情况下往前走实现收缩,直至不再满足条件,快指针继续向前

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int size = nums.size();
        //左闭右开
        int left = 0;   //闭
        int right = 0;  //开
        int sum = 0;
        int min = INT_MAX;
        while(right<size){//
            
            sum+=nums[right];//right是开区间,本次可以直接加
            right++;
            
            while(sum>=target){
                if(min > right - left){
                    min = right - left ;//立刻记录左右指针
                }
                
                sum -= nums[left];
                left++;
            }
        }
        return min==INT_MAX?0:min;
    }
};

59. 螺旋矩阵 II - 力扣(LeetCode)

注意区间定义,及其对应的边界条件

变量名和逻辑有点混乱,待改进

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> dp(n, vector<int>(n, 0));
        int time = n/2;
        int start_x = 0;
        int start_y = 0;
        int k = n-1;
        int s = 1;
        while(time--){
            for(int i = start_x;i < k;i++){
                dp[start_y][i] = s;
                s++;
                start_x++;
            }

            for(int j = start_y;j < k;j++){
                dp[j][start_x] = s;
                s++;
                start_y++;
            }

            for(int i = start_x;i>n-k-1;i--){
                dp[start_y][i] = s;
                s++;
                start_x--;
            }

            for(int j = start_y;j>n-k-1;j--){
                dp[j][start_x] = s;
                s++;
                start_y--;
            }
            k--;
            start_x++;
            start_y++;
        }
        if(n%2==1){
            dp[(n-1)/2][(n-1)/2] = s;
        }
        return dp;
    }
};

58. 区间和(第九期模拟笔试)

题目描述

给定一个整数数组Array,请计算该数组在每个指定区间内元素的总和。

输入描述

第一行输入为整数数组Array的长度n,接下来n行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间下标:a,b (b > = a),直至文件结束。

输出描述

输出每个指定区间内元素的总和。

前缀和思路,避免重复计算,提高效率

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


int main(){

    int n = 0;
    cin >> n;   //数组长度
    vector<int> P(n,0); //记录和
    int ele = 0;

    
    for(int i = 0;i<n;i++){
        cin >> ele;
        if(i==0){
            P[i]+=ele;
        }
        else P[i] = P[i-1]+ele;
    }

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



    return 0;
}

44. 开发商购买土地(第五期模拟笔试)

分别计算各行和、列和,与一半总数最接近即可

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

int main(){
    int n = 0;//row
    int m = 0;//col
    int sum = 0;
    cin >> n >>m;
    vector<int> rowadd(n); //记录n行的行和
    vector<int> coladd(m); //记录m列的列和
    vector<vector<int>> dp(n,vector<int>(m,0));
    int ele;
    for(int i = 0 ;i<n ;i++){
        for(int j = 0 ;j<m ;j++){
            cin >> ele;
            dp[i][j]=ele;
            rowadd[i]+=ele;
        }
    }


    //遍历,获得总和and列和
    for(int j = 0 ;j<m ;j++){
        for(int i = 0 ;i<n ;i++){
            coladd[j] += dp[i][j];
            sum += dp[i][j];
        }
    }

    vector<int> sigma_r(n,0); 

    int min_r = INT_MAX ;
    for(int i = 0;i<n;i++){
        if(i == 0){
            sigma_r[i] = rowadd[i];
        }
        else sigma_r[i] = sigma_r[i-1]+rowadd[i];
        min_r = min_r<abs(sum-2*sigma_r[i])?min_r:abs(sum-2*sigma_r[i]);
    }

    vector<int> sigma_c(m,0);
    int min_c = INT_MAX ;
    for(int i = 0;i<m;i++){
        if(i == 0){
            sigma_c[i] = coladd[i];
        }
        else sigma_c[i] = sigma_c[i-1]+coladd[i];
        min_c = min_c<abs(sum-2*sigma_c[i])?min_c:abs(sum-2*sigma_c[i]);
    }


    cout<<(min_c<min_r?min_c:min_r)<<endl;

}