题目 |
题目传送门:传送门(点击此处)
题解 |
思路 二分法
做阿里云在线编程得题目感受比较大得就是,理解题目!!!
同样得,简化题目所说得,找到 50 000
以及左右的第一个数字,比较一下距离左边界和有边界的位置就可以了
- 这道题目不可以用暴力法,时间复杂度会过高,所以其实这道题就是找
50 000
左右的数字,使用二分法即可 - 二分法典型的左指针
l
,右指针r
,中指针mid
,二分法的条件,就是和50 000
进行比较
如果nums[mid] == 50 000
,直接返回,因为50 000
就是1-100 000
中间的数字
如果nums[mid] < 50 000
,那么就让左指针变为mid+1
(mid+1的目的是为了跳出循环)
如果num[mid] > 50 000
,那么就让右指针变为mid
- 最后找到了两个数字分别是
50 000
左边的nums[l-1]
和50 000
右边的nums[l]
,分别比较他们两个到左右边界的距离即可
code
package solution49;
class Solution {
public int solution(int n, int[] nums) {
if (n == 1) return Math.min(nums[0] - 1, 100_000 - nums[0]);
if (nums[n - 1] <= 50000) return nums[n - 1] - 1; // 如果全部数字都是小于50 000的,可以不用判断直接返回
if (nums[0] > 50_000) return 100_000 - nums[0]; // 如果全部数字都是大于50 000的,同上
int l = 0, r = n - 1;
while (l < r) {
int mid = l + (r - l) / 2;
if (nums[mid] == 50000) {
return 49999;
} else if (nums[mid] > 50000) {
r = mid;
} else if (nums[mid] < 50000) {
l = mid + 1;
}
}
return Math.max(nums[l - 1] - 1, 100_000 - nums[l]);
}
}