首先我解了一道 leetcode 算法题
34. 在排序数组中查找元素的第一个和最后一个位置
我写完的解是这样的:
public class Question34 {
public static int[] searchRange(int[] nums, int target) {
if (nums == null || nums.length < 1) {
return new int[]{
-1, -1};
}
// 找目标值起始和终止位置,要求 logN , 非递减顺序排列, 二分查找
int start = -1;
int end = -1;
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else {
// 等于的情况 我嗅探一下看看能不能返回
start = end = mid;
// 就这个一个
if (start > 0 && nums[start - 1] != target && start < nums.length - 1 && nums[start + 1] != target) {
return new int[]{
start, end};
}
break;
}
}
if (start > 0) {
// 找到右侧第一个不等于 target 的位置
left = 0;
right = start - 1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] == target) {
start = mid;
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
}
}
}
if (end < nums.length - 1 && end >= 0) {
left = end + 1;
right = nums.length - 1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] == target) {
end = mid;
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
}
}
}
return new int[]{
start, end};
}
public static void main(String[] args) {
/*System.out.println(Arrays.toString(searchRange(new int[]{5, 7, 7, 8, 8, 10}, 8)));
System.out.println(Arrays.toString(searchRange(new int[]{5, 7, 7, 8, 8, 10}, 6)));*/
System.out.println(Arrays.toString(searchRange(new int[]{
2, 2}, 2)));
System.out.println(Arrays.toString(searchRange(new int[]{
2}, 2)));
}
}
懒得优化结构,尝试问问 ChatGPT 4
public static int[] searchRange(int[] nums, int target) {
if (nums == null || nums.length < 1) {
return new int[]{
-1, -1};
}
int start = findStart(nums, target);
int end = findEnd(nums, target);
return new int[]{
start, end};
}
private static int findStart(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int start = -1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else {
start = mid;
right = mid - 1;
}
}
return start;
}
private static int findEnd(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int end = -1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else {
end = mid;
left = mid + 1;
}
}
return end;
}
不错不错!直接分两个方法算开始位置和结束位置更简洁,我一开始的思路不在这个方向
但是吧,事情不应该这么容易 ChatGPT 4 ,我可不能让你这么简单过关
我追问
nnd 精细化看不懂是吧,诶嘿
道歉挺快
好嘛,最后还给我但是一句,看我怎么堵你
public static int[] searchRange(int[] nums, int target) {
if (nums == null || nums.length < 1) {
return new int[]{
-1, -1};
}
int start = -1;
int end = -1;
int left = 0;
int right = nums.length - 1;
// First binary search to find the target
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else {
start = end = mid;
break;
}
}
if (start == -1) {
return new int[]{
start, end};
}
// Adjust start and end positions
left = 0;
right = start - 1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] == target) {
start = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
left = end + 1;
right = nums.length - 1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] == target) {
end = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
return new int[]{
start, end};
}
知错认错改错,大 AI 时代要来了……
鬼知道我们这一代要经历多少变革
扫描二维码关注公众号,回复:
14578529 查看本文章
