查找
二分查找
续:其实也不算有序数组,如果寻找的数在一个区间内,且这个区间的数有序,那么就可以使用二分查找
对于一个有序数组,我们可以采用二分查找,把时间复杂度从O(n) 降到O(log n),二分是指对于一个有序数组,对于其有序的特性,采用从中间开始查找,同时更新数组的下标,来更快地找到目标值.
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| int a[10] ;
for(int i = 0 ; i <= 9 ; i ++) { scanf("%d",&a[i]); }
int i = 0 , j = a.size() - 1;
while(i <= j)
{
int mid = (i + j) / 2;
if(a[mid] > target) j = mid - 1;
if(a[mid] < target) i = mid + 1;
if(a[mid] == target) { cout << mid << endl; return ;}
}
|
续写
写了一道牛客的题
二分[][[B-爱恨的纠葛_2024牛客寒假算法基础集训营6 (nowcoder.com)][B-爱恨的纠葛_2024牛客寒假算法基础集训营6 (nowcoder.com)]
有了一些新的看法
Ac代码
一开始写的时候没想到是二分写了一坨
看了提示之后,选择了面对二分 悲 :(
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| #include<iostream> #include<vector> #include<algorithm>
using namespace std;
#define ll long long
const int N = 1e5 + 10;
int a[N], b[N];
void solve() { int n, ans = 0x3f3f3f3f; int idxa = 0, idxb = 0;
cin >> n; for(int i = 0;i < n;i ++) cin >> a[i];
for(int i = 0;i < n;i ++) cin >> b[i];
sort(a, a + n);
for(int i = 0;i < n;i ++) { int l = 0, r = n - 1; while(l < r) { int mid = l + r >> 1; if(a[mid] >= b[i]) r = mid; else l = mid + 1; }
if(ans > abs(a[l] - b[i])) { ans = abs(a[l] - b[i]); idxa = l; idxb = i; }
l = 0, r = n - 1; while(l < r) { int mid = l + r + 1 >> 1; if(a[mid] <= b[i]) l = mid; else r = mid - 1; }
if(ans > abs(a[l] - b[i])) { ans = abs(a[l] - b[i]); idxa = l; idxb = i; } } swap(a[idxa],a[idxb]);
for(int i = 0;i < n;i ++) cout << a[i] << ' '; }
int main() { int t = 1; while(t --) solve(); return 0; }
|