c语言刷题|有样例TLE

img

img

c语言刷题,这道也是超过时间限制,不知道怎么修改了,有几个样例不过

只要每次强化区间为 [1,n],直接就能卡成 O(n^2).

比较直观的做法是线段树。写起来短一点的做法是差分+贪心。这个是线段覆盖,典型题目。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客也许可以解决你的问题👉 :算法题遇到TLE应该怎么办?
  • 以下回答来自chatgpt:

    问题分析:根据提供的参考资料,并不是直接和问题有关联的,参考资料分别提到了如何利用数组来存储两个栈的两种写法和单链表的转置。这些和C语言编程题目的虽然有关系,但是需要对问题进行具体分析。

    推荐解决方案:问题的解决需要根据具体的代码实现情况以及问题所在的具体语句等来进行,没有直接的模板方法。但是可以提供一下一些思路和方法:

    1.从时间复杂度上考虑该问题,需要注意数据量是否大,算法的时间复杂度如何,是否可以进行空间换时间等以及代码的实现是否优雅。

    2.需要仔细阅读题目所放在的练习平台,并且根据平台日志来进行实际调试,从而定位出问题所在的具体语句。此后,通过在本地运行出问题的代码,并通过调试器进行调试,以定位出真正的错误和问题。

    3.如果可以定位出问题所在的代码行,那么可以考虑将其和相邻的几行代码分享出来,给我们更多的提示信息,这样更可能对问题的定位和解决有帮助。

    4.有些问题可能是需要对数据进行预处理,例如排序、去重等,所以需要对具体的数据情况来分析后决定是否需要采取这些措施,或者采取哪种算法来解决。

    5.根据具体情况,可以考虑采取递归、贪心、动态规划等方法来解决问题。

    6.将问题分解为小的问题来解决,例如针对单链表的链表逆置问题,可以将问题分解为针对一个节点的逆置来解决。

    7.在进行算法计算时,注意内部对数据类型的实际运用,例如类的封装和底层的函数调用等。

    如何将给定单向链表逆置

    我们先来看一下参考资料中提供的每一步处理方法。

    1.设置指向原链表的指针p

    2.新建一个链表,将原链表的节点从头开始插入新链表的表头,从实现链表转置

    3.生成一个新节点q,将原链表的表头的值赋给q(q->data=p->data);

    1. 然后将这个节点q插入到新链表的表头(q->next=head1;head1=q);

    2. 然后将指针p指向原链表下一个节点(p=p->next),直到原链表结束(p=NULL)

    伪代码如下:

    while(p!=NULL){
        q=(node *)malloc(sizeof(node));//申请空间
        q->data=p->data;//将节点值赋给q
        q->next=head1;
        head1=q;
        p=p->next;
    }
    

    我们来看一下具体的实现:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int datatype;
    typedef struct ListNode {
        datatype data;
        struct ListNode *next;
    }node;
    
    /**
     *@brief 创建链表
     *
     *@param   void 
     *@retval  头指针 
     */
    node *createlist(); 
    
    /**
     *@brief 链表反转
     *
     *@param   头指针head
     *@retval  新的头指针 
     */
    node *reverse( node *head );
    
    /**
     *@brief 链表输出
     *
     *@param   头指针head 
     *@retval  void 
     */
    void printlist(node *head ); 
    
    int main()
    {
        node  *head;
    
        head = createlist();
        head = reverse(head);
        printf("链表反转过后的元素值:");
        printlist(head);
    
        return 0;
    }
    
    node * createlist()
    {
        node *head,*r,*s;
        datatype x;
        head=r=NULL;
        printf("输入链表的值,以-1结束\n");
        scanf("%d",&x);
        while (x!=-1) 
        {    
            s=(node *)malloc(sizeof(node));
            s->data=x;
            if (head==NULL) 
                head=s;
            else
                r->next=s;
            r=s;
            scanf("%d",&x);
       }
        if (r)  r->next=NULL;
        return head; /*返回建立的单链表*/
    }
    
    void printlist(node *head )
    {
         node *p = head;
         if (p==NULL){
         printf("-1");
         }else{
            while (p) {
               printf("%d ", p->data);
               p = p->next;
            }
         }
         printf("\n");
    }
    
    node *reverse( node *head ){
        node *head1=NULL;
        node *p,*q;//工作指针q  
        p=head;//工作指针p,指向要进行插入新链表的节点 
        while(p!=NULL){
            q=(node *)malloc(sizeof(node));//申请空间 
            q->data=p->data;//将节点值赋给q
            q->next=head1;
            head1=q; 
            p=p->next;
        } 
        return head1;
    }
    

    运行结果如下,正确反转了单向链表:

    最后需要注意,这里的代码并没有进行内存释放处理,需要自行加上,以防止内存泄漏。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^