二分简单题
2015-07-31 22:50
176 查看
二分·二分查找
题目传送:hihoCoder - 1128 - 二分·二分查找解法一:先排个序,然后在进行二分查找,复杂度为O(n*logn) 。
AC代码:
[code]#include <map> #include <set> #include <cmath> #include <deque> #include <queue> #include <stack> #include <cstdio> #include <cctype> #include <string> #include <vector> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define INF 0x7fffffff using namespace std; int n, k; int a[1000005]; int b_search(int x) { int L = 0, R = n - 1; while(L <= R) { int mid = (L + R) >> 1; if(a[mid] == x) return mid + 1; else if(a[mid] > x) R = mid - 1; else if(a[mid] < x) L = mid + 1; } return -1; } int main() { while(scanf("%d %d", &n, &k) != EOF) { for(int i = 0; i < n; i ++) { scanf("%d", &a[i]); } sort(a, a + n); int ans = b_search(k); printf("%d\n", ans); } return 0; }
解法二:直接找是否存在k,并且有多少比k小的数,复杂度O(n)。
AC代码:
[code]#include <map> #include <set> #include <cmath> #include <deque> #include <queue> #include <stack> #include <cstdio> #include <cctype> #include <string> #include <vector> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define INF 0x7fffffff using namespace std; int n, k, a; int main() { scanf("%d %d", &n, &k); int ans = 0; int flag = 0; for(int i = 0; i < n; i ++) { scanf("%d", &a); if(a < k) ans ++; if(a == k) flag = 1; } if(flag == 1) { printf("%d\n", ans + 1); } else printf("-1\n"); return 0; }
二分·二分查找之k小数
题目传送:hihoCoder - 1133 - 二分·二分查找之k小数解法一:直接先排个序,然后在找第k小数,复杂度为O(n*logn)。
AC代码:
[code]#include <map> #include <set> #include <cmath> #include <deque> #include <queue> #include <stack> #include <cstdio> #include <cctype> #include <string> #include <vector> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define INF 0x7fffffff using namespace std; int n, k; int a[1000005]; int main() { scanf("%d %d", &n, &k); for(int i = 1; i <= n; i ++) { scanf("%d", &a[i]); } sort(a + 1, a + n + 1); if(k > n || k < 1) printf("-1\n"); else printf("%d\n", a[k]); return 0; }
解法二:手写一个快排,其中排除掉不需要排序的区间,这样理论上可以达到O(n)的复杂度
AC代码:
[code]#include <map> #include <set> #include <cmath> #include <deque> #include <queue> #include <stack> #include <cstdio> #include <cctype> #include <string> #include <vector> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define INF 0x7fffffff using namespace std; int a[1000005]; int n, k; void Qsort(int *a, int low, int high) { if(low > k) return; if(high < k) return; if(low >= high) return; int first = low; int last = high; int key = a[first]; while(first < last) { while(first < last && a[last] >= key) last --; a[first] = a[last]; while(first < last && a[first] <= key) first ++; a[last] = a[first]; } a[first] = key; Qsort(a, low, first - 1); Qsort(a, first + 1, high); } int main() { scanf("%d %d", &n, &k); for(int i = 1; i <= n; i ++) { scanf("%d", &a[i]); } Qsort(a, 1, n); printf("%d\n", a[k]); return 0; }
解法三:
nth_element函数,用于排序无序数组里的第n个数,位于
<algorithm>头文件里
AC代码:
[code]#include <map> #include <set> #include <cmath> #include <deque> #include <queue> #include <stack> #include <cstdio> #include <cctype> #include <string> #include <vector> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define INF 0x7fffffff using namespace std; int a[1000005]; int main() { int n, k; scanf("%d %d", &n, &k); for(int i = 1; i <= n; i ++) { scanf("%d", &a[i]); } nth_element(a + 1, a + k, a + n + 1); printf("%d\n", a[k]); return 0; }
相关文章推荐
- linux 下tomcat 6 启动出现日志异常
- [WPF]记一个Win8"缩放级别"设置导致的问题
- Visualization of Detail Point Set by Local Algebraic Sphere Fitting
- 如何理解php中命名空间概念
- hdu 5314 Happy King 树点分冶 树状数组
- hadoop学习笔记(七)——hadoop权威指南中天气数据运行
- 数码管问题(c++实现)
- epoll的两种触发模式
- 华为 试题 最小长方形 算法
- 1.PHP站内搜索
- Android Volley入门到精通:使用Volley加载网络图片(示例,出错代码)
- 1.PHP站内搜索 分类: PHP开发实例 2015-07-31 22:48 4人阅读 评论(0) 收藏
- hdu 2795 Billboard 【线段树】
- Aspose.Words组件介绍及使用—基本介绍与DOM概述
- 如何使用Android MediaStore裁剪大图片
- ShellExecute使用详解
- PHP实例开发(1)PHP站内搜索
- F - Warm up - hdu 4612(缩点+求树的直径)
- Partition List
- 离职是件快乐的事