题目:给定一个有序数组,但是数组尾部的k个元素被移到了头部,查找该数组中的最小值。例如A={4,5,0,1,2},最小元素为0。
1、假设数组中没有重复元素
public int findMin(int[] nums) {
if(nums.length==1)return nums[0];
int left=0,right=nums.length-1,mid;
int min=nums[0];
while(left<=right){
mid=left+(right-left)/2;
if(nums[mid]<min){
right=mid;
min=nums[mid];
}else{
left=mid+1;
}
}
return min;
}
2、数组中有重复元素
只有数组头尾相同时,才会无法判断数组那部分数据有序,因此当首位相同时只需要移动尾指针直到首尾字符不相同,这时问题又退化到情况1。
public int findMin(int[] nums) {
if (nums == null || nums.length == 0) {
return Integer.MIN_VALUE;
}
int start = 0, end = nums.length - 1;
//only need to add the following while loop on top of the solution
//for Part I
//if two line segments have overlap, remove the overlap.
//so, the problem can be solved as Part I
while (nums[end] == nums[start] && end > start) {
end--;
}
while (start < end) {
//if the linear monotonically increasing in [start, end]
if (nums[start] < nums[end]) {
return nums[start];
}
int mid = start + (end - start) / 2;
if (nums[mid] >= nums[start]) {
start = mid + 1;
}
else {
end = mid;
}
}
return nums[start];
}
如何将旋转数组变为正常数组?
public static void roatArray(int[] val) {
//find the roat pos
int i=0,len=val.length-1;
while(i<len-1){
if(val[i]<val[i+1])i++;
else break;
}
//0...i and i+1...len is sorted
//step 1:reverse 0...len
reverse(val,0,len);
//step 2:reverse 0...len-i-1
reverse(val,0,len-i-1);
//step 3:reverse len-i...len
reverse(val,len-i,len);
}
public static void reverse(int[] val, int s, int e) {
int temp;
for (int i = s,j=e; i < j; i++,j--) {
temp = val[i];
val[i] = val[j];
val[j] = temp;
}
}
在旋转数组中查找指定的元素:
// get target
public static int getValue(int[] val,int target){
int start=0,end=val.length-1;
int mid=0;
while(start<=end){
mid=(start+end)/2;
if(target==val[mid])return mid;
while(start<=end&&val[end]==val[start])end--;
if(val[mid]<val[end]){
//right is sorted
if(target>val[mid]&&target<=val[end]){
start=mid+1;
}else if(target<val[mid]||target>val[end]){
end=mid-1;
}
}else{
//left is sorted
if(target>=val[start]&&target<val[mid]){
end=mid-1;
}else if(target<val[start]||target>val[mid]){
start=mid+1;
}
}
}
return -1;
}