当前位置: 代码迷 >> 综合 >> 模板--HihoCoder--1133--非有序数组的二分查找
  详细解决方案

模板--HihoCoder--1133--非有序数组的二分查找

热度:59   发布时间:2023-12-12 06:06:32.0

题目链接:https://vjudge.net/problem/HihoCoder-1133/origin

输入

第1行:2个整数N,k。N表示数组长度,
第2行:N个整数,表示a[1..N],保证不会出现重复的数,1≤a[i]≤2,000,000,000。

输出

第1行:一个整数t,表示t在数组中是第k小的数,若K不在数组中,输出-1。

Sample Input
10 4
1732 4176 2602 6176 1303 6207 3125 1 1011 6600
Sample Output
1732

思路一模板:非有序数组的二分查找

思路二:快速排序,快速查找;

int search(int left,int right){int ans=-1;while(left<=right){int w=rand()%(right-left+1)+left;swap(a[left],a[w]);int temp=a[left],tleft=left,tright=right;while(tleft<tright){while(tleft<tright&&a[tright]>=temp)	tright--;a[tleft]=a[tright];while(tleft<tright&&a[tleft]<=temp)		tleft++;a[tright]=a[tleft];}a[tleft]=temp;if(tleft==k){	ans=a[tleft];break;}else if(tleft>k)	right=tleft-1;else left=tleft+1;}return ans;
}

完整代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const int maxa=1e7+10;
int n,k; 
int a[maxa];
void read(int &x){x=0;bool f=0;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') f=1;ch=getchar();}while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}x=f?(~x)+1:x;
}
int search(int left,int right){int ans=-1;while(left<=right){int w=rand()%(right-left+1)+left;swap(a[left],a[w]);int temp=a[left],tleft=left,tright=right;while(tleft<tright){while(tleft<tright&&a[tright]>=temp)	tright--;a[tleft]=a[tright];while(tleft<tright&&a[tleft]<=temp)		tleft++;a[tright]=a[tleft];}a[tleft]=temp;if(tleft==k){	ans=a[tleft];break;}else if(tleft>k)	right=tleft-1;else left=tleft+1;}return ans;
} 
int main(){read(n);read(k);for(int i=1;i<=n;i++)read(a[i]);printf("%d\n",search(1,n)); 
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const int maxa=1e7+10;
int n,k; 
int a[maxa];
void read(int &x){x=0;bool f=0;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') f=1;ch=getchar();}while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}x=f?(~x)+1:x;
}
int main(){read(n);read(k);for(int i=1;i<=n;i++)read(a[i]);sort(a+1,a+1+n);printf("%d\n",a[k]);
}

 

  相关解决方案