leetcode练习
33搜索旋转排序数组
如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的,我们只要在有序的半段里用首尾两个数组来判断目标值是否在这一区域内,这样就可以确定保留哪半边了。
public int search(int[] nums, int target) {
int len = nums.length;
int left = 0, right = len-1;
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] == target)
return mid;
else if(nums[mid] < nums[right]){
if(nums[mid] < target && target <= nums[right])
left = mid+1;
else
right = mid-1;
}
else{
if(nums[left] <= target && target < nums[mid])
right = mid-1;
else
left = mid+1;
}
}
return -1;
}
34.在排序数组中查找元素的起始和结束位置
这道题需要注意的只有一点,就是在判断循环时要先判断下标是否越界,在判断该索引值是否满足条件。
public int[] searchRange(int[] nums, int target) {
int[] re = new int[]{-1, -1};
int left = 0, right = nums.length - 1;
while (left <= right){
int mid = (left + right) / 2;
if(nums[mid] == target){
int a = mid, b = a;
while (a >= 0 && nums[a--] == target ) re[0] = a + 1;
while (b <= nums.length - 1 && nums[b++] == target) re[1] = b - 1;
return re;
}else if(nums[mid] < target){
left = mid + 1;
}else {
right = mid - 1;
}
}
return re;
}