2015年408算法题

简介: 故辅助数组 q 的大小为 n+1,各元素的初值均为 0。依次扫描链表中的各结点,同 时检查 q[|data|]的值,如果为 0,则保留该结点,并令 q[|data|]=1;否则,将该结点从链表中删除。

image.png1 )算法的基本设计思想 算法的核心思想是用空间换时间。使用辅助数组记录链表中已出现的数值,从而只需对链表进行 一趟扫描。 因为 |data| ≤n,故辅助数组 q 的大小为 n+1,各元素的初值均为 0。依次扫描链表中的各结点,同 时检查 q[|data|]的值,如果为 0,则保留该结点,并令 q[|data|]=1;否则,将该结点从链表中删除。

typedef struct node{
  int data;
  struct node *link;
}NODE;
typedef NODE *PNODE;
void func (PNODE h,int n){   
    PNODE p=h,r;
    int *q,m;
    q=(int *)malloc(sizeof(int)*(n+1));//申请n+1个位置的辅助空间
    for(int i=0;i<n+1;i++) //数组元素初值置为0
      *(q+i)=0;
    while(p->link!=NULL)
    {
      m=p->link->data>0?p->link->data:-p->link->data;
      if(*(q+m)==0) //判断该结点的data是否已出现过
      {
        *(q+m)=1; //首次出现
        p=p->link; //保留
      }
      else{  //重复出现
        r=p->link;  //删除
        p->link=r->link;
        free(r);
      }
    }
    free(q);
}

算法的时间复杂度为 O(m) ,空间复杂度为 O(n) 

相关文章
|
8天前
|
算法
算法题(6)
算法题(6)
21 7
|
7天前
|
算法
算法题(8)
算法题(8)
9 4
|
7天前
|
算法
算法题(7)
算法题(7)
9 3
|
2月前
|
存储 算法 网络安全
|
4月前
|
算法
什么是退火算法
什么是退火算法
|
4月前
|
算法 C++ 容器
【C++11新算法】all_of、any_of、none_of算法
【C++11新算法】all_of、any_of、none_of算法
|
11月前
|
算法
算法
一、算法 常见的图查找算法包括: 1. 深度优先搜索(DFS):从图中的一个节点开始,沿着一条路径一直深入直到无法再深入为止,然后回溯到上一个节点,继续深入其他路径,直到找到目标节点或遍历完所有节点。 2. 广度优先搜索(BFS):从图中的一个节点开始,先访问它的所有邻居节点,然后再依次访问邻居的邻居节点,直到找到目标节点或遍历完所有节点。 3. Dijkstra算法:用于在带权有向图中找到从一个节点到其他节点的最短路径。该算法通过不断更新节点的最短距离来逐步找到最短路径。 4. A*算法:类似于Dijkstra算法,但在计算最短路径时加入了启发式函数,用于估计目标节点的距离,从而加速搜索过程
387 0
|
算法
转:johnson算法的现实意义
Johnson算法是一种用于解决边数与节点数之间关系为O(n^2)的带权图的最短路径问题的算法。它是一种结合了Dijkstra算法和Bellman-Ford算法的技术,通过使用一个负权重的环检测器来消除负权重的影响。这种算法的时间复杂度为O(n^2+m log n)。
131 1
|
机器学习/深度学习 人工智能 算法
秒懂算法 | 尺取法
尺取法(又称为:双指针、two pointers),是算法竞赛中一个常用的优化技巧,用来解决序列的区间问题,操作简单、容易编程。 本篇介绍了尺取法的概念、反向扫描、同向扫描、模板、典型题目。
354 1
秒懂算法 | 尺取法
|
JavaScript 算法 前端开发
vueDiff 算法解读
前言 在面试中谈到 vue 源码,一般都会扯扯 diff 算法,而这个 diff 又在网上传的神乎其神的,说是提升了页面更新性能,我们一起看看到底咋回事吧