leetcode 0034
说明
只是为了记录一下,不求多快,也不深究。
会简要描述思路,代码中不写注释。
如碰到不会做的用了别人代码会在博客中标出。
题目描述
思路
又是二分法的题。
我是这样做的:
第一个循环:用二分找到任意一个目标数的位置idxTarget。
第二个循环:从0到idxTarget还是用二分找到第一个目标位置,即本身是target且前一个不是target或前一个不存在。
第三个循环思路和第二个循环一样,从idxTarget到nums.length-1找到最后一个目标位置。
时间复杂度大概是O(3logn).
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] res = { -1, -1 };
if (nums.length == 0) {
return res;
}
if (nums.length == 1) {
if (target == nums[0]) {
return new int[] { 0, 0 };
} else {
return res;
}
}
if (target < nums[0] || target > nums[nums.length - 1]) {
return res;
}
int start = 0, end = nums.length;
int idxTarget = -1;
while (start <= end) {
int mid = (start + end) / 2;
if (nums[mid] > target) {
end = mid - 1;
} else if (nums[mid] < target) {
start = mid + 1;
} else {
idxTarget = mid;
break;
}
}
if (idxTarget == -1) {
return res;
}
start = 0;
end = idxTarget;
while (start <= end) {
int mid = (start + end) / 2;
if (nums[mid] != target) {
start = mid + 1;
} else if (mid != 0 && nums[mid - 1] == target) {
end = mid - 1;
} else {
res[0] = mid;
break;
}
}
start = idxTarget;
end = nums.length;
while (start <= end) {
int mid = (start + end) / 2;
if (nums[mid] != target) {
end = mid - 1;
} else if (mid != nums.length - 1 && nums[mid + 1] == target) {
start = mid + 1;
} else {
res[1] = mid;
break;
}
}
return res;
}
}