- 算法
递归、二分法 - 核心思想
最开始打算使用双指针的二分方法进行处理,结果发现没有办法解决找到第一个后,下一步界限的确定,压倒我这个思路的最后一根稻草是【1,1,1】,查找1.
最后选择了递归法解决,觉得比较复杂的就是最后结果的迭代,我处理的不好。 - 代码
class Solution {
public int[] search(int[] nums, int target,int left,int right){
System.out.println("left:"+left);
System.out.println("right:"+right);
if(nums.length == 0) return new int[]{-1,-1};
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int[] temp1 = new int[]{Integer.MAX_VALUE,Integer.MIN_VALUE};
int[] temp2 = new int[]{Integer.MAX_VALUE,Integer.MIN_VALUE};
while(left <= right){
int mid = left + (right - left)/2;
if(nums[mid] == target){
if(mid > max) max = mid;
if(mid < min) min = mid;
temp1 = search(nums,target,left,mid-1);
temp2 = search(nums,target,mid+1,right);
if(temp1[0] == -1 && temp2[0] == -1) {
return new int[]{min,max};
}else if(temp1[0] == -1){
return new int[]{Math.min(min,temp2[0]),Math.max(max,temp2[1])};
}else if(temp2[0] == -1){
return new int[]{Math.min(min,temp1[0]),Math.max(max,temp1[1])};
}else{
return new int[]{Math.min(min,Math.min(temp1[0],temp2[0])),Math.max(max,Math.max(temp1[1],temp2[1]))};
}
}else if(nums[mid] > target){
right = mid - 1;
}else left = mid + 1;
}
return new int[]{-1,-1};
}
public int[] searchRange(int[] nums, int target) {
if(nums.length == 0) return new int[]{-1,-1};
return search(nums,target,0,nums.length-1);
}
}