1 条题解
-
0
终于第一个通过一题了!!! 仔细想想,这道题其实不难,关键在于这条规律:一个有序数组中的同一种元素是相邻的 因此,我们可以先通过二分找到x,再通过双指针找到边界
for (int i = 1 ; i <= q ; i++) { cin >> x; //二分 int l = 1 , r = n , mid; while (l <= r) { mid = (l + r) / 2; if (a[mid] < x) { l = mid + 1; } else if (a[mid] > x) { r = mid - 1; } else { break; } } //双指针 int first = mid , end = mid; while (a[first] == x || a[end] == x) { if (a[first] == x) { first--; } if (a[end] == x) { end++; } } //由于first与end找到的分别是第一个小于x的数与第一个大于x的数,所以分别需加一与减一 first++; end--; //若数组a中没有x,则不会执行双指针代码,由于first与end的初始值相同,因此执行47~48行时会导致first大于end if (first > end) { first = -1; end = -1; } cout << first << " " << end << endl; }
- 1
信息
- ID
- 1074
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 169
- 已通过
- 36
- 上传者