Search in Rotated Sorted Array
在旋转数组里查找目标值,数字没有重复数字。
解法:二分查找
分析:如果nums[mid]<target && target<=nums[high],则low=mid+1;
如果nums[mid]>target && target>=nums[low]则high=mid-1;
class Solution {
public int search(int[] nums, int target) {
int low=0,high=nums.length-1,mid=0;
while(low<=high){
mid=(low+high)/2;
if(nums[mid]==target)
return mid;
else if(nums[mid]<nums[high]){
if(nums[mid]<target && target<=nums[high])
low=mid+1;
else
high=mid-1;
}else{
if(nums[mid]>target && target>=nums[low])
high=mid-1;
else
low=mid+1;
}
}
return -1;
}
}
Search in Rotated Sorted Array II
在旋转数组里查找目标值,数字没有重复数字。
解法:二分查找
分析:如果nums[mid]<nums[high] 下:nums[mid]<target && target<=nums[high],则low=mid+1;否则high=mid-1;
如果nums[mid]>nums[high]下:nums[mid]>target && target>=nums[low]则high=mid-1;否则low=mid+1;
如果nums[mid]==nums[high],这时候mid和high之前不确定,所以只可以high--;
class Solution {
public boolean search(int[] nums, int target) {
int low=0,high=nums.length-1,mid=0;
while(low<=high){
mid=(low+high)/2;
if(nums[mid]==target)
return true;
else if(nums[mid]<nums[high]){
if(nums[mid]<target && target<=nums[high])
low=mid+1;
else
high=mid-1;
}else if(nums[mid]>nums[high]){
if(nums[mid]>target && target>=nums[low])
high=mid-1;
else
low=mid+1;
}else
high--;
}
return false;
}
}
Find Minimum in Rotated Sorted Array
解法:二分查找
分析:当nums[mid]<nums[high]时,说明mid+1-high可以丢弃
当nums[mid]>nums[high]时,说明low-mid可以丢弃掉
class Solution {
public int findMin(int[] nums) {
int low=0,high=nums.length-1,mid=0;
while(low<high){
mid=(low+high)/2;
if(nums[mid]<nums[high])
high=mid;
else
low=mid+1;
}
return nums[low];
}
}
public class Solution {
public int minNumberInRotateArray(int [] nums) {
int low=0,high=nums.length-1,mid=0;
while(low<=high){
mid=(low+high)/2;
if(nums[mid]<nums[high])
high=mid;
else if(nums[mid]>nums[high])
low=mid+1;
else if(nums[mid]==nums[high])
high--;
}
return nums[low];
}
}