春节7天练 | Day 2:栈、队列和递归

本文聚焦于栈、队列和递归的编程应用,通过探讨'有效括号'、'最长有效括号'问题以及实现'滑动窗口最大值'算法,深入理解这些数据结构和概念。此外,还介绍了类似爬楼梯这样的递归问题解决方法,提升你的编程能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

valid parentheses

bool isValid(char* s) {
    int i = 0;
    
    int len = strlen(s);
    
    if(len%2) return false;
    
    int limit = len/2;
    
    char *stack = (char*)malloc(sizeof(char)*(len+1));
    
    int top = 0;
    
    for(i=0;i<len;i++)
    {
        char now = s[i];
        if(now == '('||now=='['||now=='{')
            stack[top++] = now;
        else
        {
            if(top == 0)
                return false;
            if((now==')'&&stack[top-1]=='(')||(now==']'&&stack[top-1]=='[')||(now == '}'&&stack[top-1]=='{'))
                top -- ;
            else 
                return false;
        }
    }
    if(top!=0)
        return false;
    return true;
}

longest valid parentheses

typedef struct Node{
    char content;
    int loc;
}Node;

int longestValidParentheses(char* s) {
    int len = (int)strlen(s);
    Node *stack = (Node *)malloc(sizeof(Node)*len);
    int *numList = (int*)malloc(sizeof(int)*len);
    int top = -1;
    for(int i=0;i<len;i++){
        if(top >= 0 && s[i]==')' && stack[top].content == '(' ){
            top--;
            numList[i] = (top>=0)? stack[top].loc:-1;
        } else{
            top++;
            stack[top].content = s[i];
            stack[top].loc = i;
            numList[i] = i;
        }

    }

    for(int i = 0;i<len;i++)
        numList[i] = i-numList[i];

    int max = 0;
    for(int i=0;i<len;i++){
        if(numList[i]>max)
            max = numList[i];
    }
    return max;
}

滑动窗口最大值

/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) {
   
    if(numsSize == 0) return NULL;
     *returnSize = numsSize - k + 1;
    if(numsSize==1)
    {
        if(k==1)
        {
             int *ans = (int *)malloc(*returnSize*sizeof(int));
            ans[0] = nums[0];
            return ans;
        }
    }
    
    int *ans = (int *)malloc(*returnSize*sizeof(int));
    int max=INT_MIN;
    int dp[numsSize];
    int i = 0;
    for (int i = 0, j, max = INT_MIN,first = -1; i < *returnSize; ++i)
    {
        if (first < i)
        { 
            for (max = nums[i], first = i, j = i + 1; j < k + i; ++j)
            {
                if (max < nums[j])
                {
                    max = nums[j];
                    first = j;
                }
            }
        }
        else if (nums[i + k - 1] >= max) 
        {
            first = i + k - 1;
            max = nums[i + k - 1];
        }
        ans[i] = max;
    }
    return ans;
}

爬楼梯

int climbStairs(int n) {
    if(n==1)
        return 1;
    int first = 1;
    int second = 2;
    int i;
    int third;
    for(i=3;i<=n;i++)
    {
        third = first + second;
        first = second;
        second = third;
    }       
    return second;
}
ps 这样防止时间超限
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值