【题目链接】

ybt 1245:不重复地输出数
OpenJudge NOI 1.11 08:不重复地输出数

【题目考点】

1. 二分查找

2. 复杂度为O(nlogn)的排序

  • 快速排序:时间复杂度O(nlogn),额外空间复杂度O(1),不稳定
  • 归并排序:时间复杂度O(nlogn),额外空间复杂度O(n),稳定

【解题思路】

解法1:插入排序+二分查找

维护一个升序数组。
每读入一个数字,先通过二分查找判断数组中是否存在该数字。

  • 如果存在,那么就略过。
  • 如果不存在,就将该数字通过插入排序的方法插入到数组中,保持数组是升序的。
    最后输出整个数组。

解法2:O(nlogn)排序算法

输入数据的规模为10510^5105,可以使用复杂度为O(nlogn)的排序算法将其排序,然后遍历数组,输出时如遇到相同的元素,则只输出一个。

【题解代码】

解法1:插入排序+二分查找

  • 手写二分查找
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int a[N], an;
bool isFound(int x)//二分查找数组a中是否存在数值x
{int l = 1, r = an, m;while(l <= r){m = (l + r) / 2;if(x < a[m])r = m - 1;else if(x > a[m])l = m + 1;elsereturn true;}return false;
}
int main()
{int n, x;cin >> n;for(int i = 1; i <= n; i++){cin >> x;if(isFound(x) == false){a[++an] = x;for(int j = an; j > 1; j--)//将x插入升序数组a {if(a[j] < a[j-1])swap(a[j], a[j-1]);elsebreak;   }}}for(int i = 1; i <= an; ++i)cout << a[i] << ' ';return 0;
}
  • 使用stl函数:binary_search()
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int a[N], an;
int main()
{int n, x;cin >> n;for(int i = 1; i <= n; i++){cin >> x;if(binary_search(a+1, a+1+an, x) == false)//查找数组a从a[1]~a[an]中是否有x {a[++an] = x;for(int j = an; j > 1; j--)//将x插入升序数组a {if(a[j] < a[j-1])swap(a[j], a[j-1]);elsebreak; }}}for(int i = 1; i <= an; ++i)cout << a[i] << ' ';return 0;
}

解法2:O(nlogn)排序

快速排序
  • 手写二路快排
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int a[N];
void qsort(int l, int r)//二路快速排序
{int i = l, j = r, mid = a[(l+r)/2];while(i <= j){while(a[i] < mid)i++;while(a[j] > mid)j--;if(i <= j){swap(a[i], a[j]);i++, j--;}}if(l < j)qsort(l, j);if(i < r)qsort(i, r);
}
int main()
{int n, x;cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];qsort(1, n);//快速排序 cout << a[1] << ' ';for(int i = 2; i <= n; ++i)if(a[i] != a[i-1])//连续相同的数字就不输出了,发现不同的数字再输出 cout << a[i] << ' ';return 0;
}
  • 使用stl的sort()排序
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int a[N];
int main()
{int n, x;cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];sort(a+1, a+1+n);//升序排序 cout << a[1] << ' ';for(int i = 2; i <= n; ++i)if(a[i] != a[i-1])//连续相同的数字就不输出了,发现不同的数字再输出 cout << a[i] << ' ';return 0;
}
归并排序
  • 手写归并排序
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int a[N], t[N];
void msort(int l, int r)//归并排序
{if(l >= r)return;int m = (l+r)/2;msort(l, m);msort(m+1, r);int ti = l, li = l, ri = m+1;while(li <= m && ri <= r){if(a[li] < a[ri])t[ti++] = a[li++];elset[ti++] = a[ri++];}while(li <= m)t[ti++] = a[li++];while(ri <= r)t[ti++] = a[ri++];for(int i = l; i <= r; ++i)a[i] = t[i];
}
int main()
{int n, x;cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];msort(1, n);//归并排序 cout << a[1] << ' ';for(int i = 2; i <= n; ++i)if(a[i] != a[i-1])//连续相同的数字就不输出了,发现不同的数字再输出 cout << a[i] << ' ';return 0;
}
  • 使用stl的stable_sort()排序
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int a[N];
int main()
{int n, x;cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];stable_sort(a+1, a+1+n);//归并排序 cout << a[1] << ' ';for(int i = 2; i <= n; ++i)if(a[i] != a[i-1])//连续相同的数字就不输出了,发现不同的数字再输出 cout << a[i] << ' ';return 0;
}

信息学奥赛一本通 1245:不重复地输出数 | OpenJudge NOI 1.11 08:不重复地输出数相关推荐

  1. 信息学奥赛一本通 1149:最长单词2 | OpenJudge NOI 1.13 16

    [题目链接] ybt 1149:最长单词2 OpenJudge NOI 1.13 16:最长单词2 [题目考点] 1. 字符串遍历 2. 处理多个字符串 3. while(cin >> - ...

  2. 信息学奥赛一本通 1148:连续出现的字符 | OpenJudge NOI 1.9 11

    [题目链接] ybt 1148:连续出现的字符 OpenJudge NOI 1.9 11:连续出现的字符 [题目考点] 1. 字符串处理 2. 数值统计 [题解代码] 解法1:比较相邻字符 #incl ...

  3. 信息学奥赛一本通 1145:字符串p型编码 | OpenJudge NOI 1.7 31:字符串p型编码

    [题目链接] ybt 1145:字符串p型编码 OpenJudge NOI 1.7 31:字符串p型编码 [题目考点] 1. 字符串处理 [解题思路] 遍历字符串,设置变量curNum表示当前关注的数 ...

  4. 信息学奥赛一本通 1143:最长最短单词 | OpenJudge NOI 1.7 25

    [题目链接] ybt 1143:最长最短单词 OpenJudge NOI 1.7 25:最长最短单词 [题目考点] 1. 字符串处理 [解题思路] 思路1:将字符串分解为多个单词,而后求出各个单词的长 ...

  5. 信息学奥赛一本通 1121:计算矩阵边缘元素之和 | OpenJudge NOI 1.8 03:计算矩阵边缘元素之和

    [题目链接] ybt 1121:计算矩阵边缘元素之和 OpenJudge NOI 1.8 03:计算矩阵边缘元素之和 [题目考点] 1. 二维数组 [解题思路] 解法1:遍历外圈 一个m行n列的矩阵, ...

  6. 信息学奥赛一本通 1045:收集瓶盖赢大奖 | OpenJudge NOI 1.4 07

    [题目链接] ybt 1045:收集瓶盖赢大奖 OpenJudge NOI 1.4 07:收集瓶盖赢大奖 [题目考点] 1. 逻辑运算符:或 || 逻辑表达式a || b a与b的值都是false时, ...

  7. 信息学奥赛一本通 1042:奇偶ASCII值判断 | OpenJudge NOI 1.4 04

    [题目链接] ybt 1042:奇偶ASCII值判断 OpenJudge NOI 1.4 04:奇偶ASCII值判断 [题目考点] 1. if-else语句 2. 三目运算符?: 3. 判断奇数偶数 ...

  8. 信息学奥赛一本通 1037:计算2的幂 | OpenJudge NOI 1.3 20

    [题目链接] ybt 1037:计算2的幂 OpenJudge NOI 1.3 20:计算2的幂 [题目考点] 1. 不同整型数据的范围 类型 占用字节数 可表示数字范围 char 1 -127~12 ...

  9. 信息学奥赛一本通 1030:计算球的体积 | OpenJudge NOI 1.3 12

    [题目链接] ybt 1030:计算球的体积 OpenJudge NOI 1.3 12:计算球的体积 [题目考点] 1. 浮点型常量 如果直接写一个数字,就是一个整型常量,如:10. 如果要表示一个浮 ...

最新文章

  1. 全新 Sitecore Experience Cloud™ 助推数字体验转型
  2. 链路负载均衡: 高性能和高安全的同时实现
  3. python入门教程书-清华大学出版社-图书详情-《Python快速入门精讲》
  4. 利用curl命令测试服务端
  5. 动态给div追加html代码,javascript – 动态添加/删除div到html
  6. 将微服务注册到Eureka Server上
  7. 学不会的JAVA,消不了的忧愁! 1
  8. uuid生成_php如何生成 uuid(总结)
  9. 计算机设备投标标书范本,OA办公自动化系统投标文件(标书范本)
  10. 《高性能MySQL》第2章~第4章
  11. iOS底层探索之KVC
  12. css(二) block,inline和inline-block概念和区别
  13. 电影下载、播放、制作、转换、各类问题全攻略
  14. 关于HDS的高端存储设备USPV
  15. Acwing-4818. 奶牛大学
  16. 一键重装系统 韩博士装机大师U盘启动一键重装
  17. SAP CO TCode
  18. https 请求需要证书,忽略安全证书
  19. AI在招聘领域的这些应用,你都知道几个?
  20. 计算机学院嘉年华标题,“芯动盛夏 AI创南航” 计算机学院举办第八届计算机嘉年华...

热门文章

  1. .net/c#中栈和堆的区别及代码在栈和堆中的执行流程详解之一(转)
  2. 如何:添加缺少的 ContentPlaceHolder
  3. 大数据专家手把手教你打造实时数据湖
  4. 关于“数据中心”的最强入门科普
  5. rust如何进枪战服_rust手机版
  6. css 解析 开源库_干货 | python库大全,全面高效
  7. 大城市卷不动了,我要回老家!
  8. Java 面试题全梳理
  9. Java进程CPU占用高导致的网页请求超时的故障排查
  10. 程序员看《长安十二时辰》的正确姿势~!