搜索旋转排序数组1:
假设有一个排序的按未知的旋转轴旋转的数组(比如,0 1 2 4 5 6 7可能成为4 5 6 7 0 1 2)。给定一个目标值进行搜索,如果在数组中找到目标值返回数组中的索引位置,否则返回-1。
你可以假设数组中不存在重复的元素。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出[4, 5, 1, 2, 3]和target=1,返回 2
给出[4, 5, 1, 2, 3]和target=0,返回 -1
思想:这个题练习的是二分查找,首先找到最中间的数a[mid],将a[mid]和target比较大小,再让a[mid]和target分别和a[0]和a[n]比较大小,来确定low和high应该往哪个方向移动。思想就是这样,代码如下:
public class Solution {
/**
*@param A : an integer rotated sorted array
*@param target : an integer to be searched
*return : an integer
*/
public static int search(int[] a, int target)
{
if (a.length == 0)
return -1;
if (a[0] == target)
return 0;
if (a[a.length - 1] == target)
return a.length - 1;
int low = 0;
int high = a.length - 1;
int mid;
int n = a.length - 1;
while (low < high)
{
mid = (low + high) / 2;
if (a[mid] == target)
return mid;
if (a[mid] > target)
{
if (a[mid] < a[n])
high = mid - 1;
if (a[mid] > a[0] && target > a[0])
high = high - 1;
if (a[mid] > a[0] && target < a[0])
low = mid + 1;
}
if (a[mid] < target)
{
if (a[mid] < a[n] && target < a[n])
low = mid + 1;
if (a[mid] < a[n] && target > a[n])
high = mid - 1;
if (a[mid] > a[0])
low = mid + 1;
}
}
return -1;
}
}
搜索旋转排序数组2:
跟进“搜索旋转排序数组”,假如有重复元素又将如何?
是否会影响运行时间复杂度?
如何影响?
为何会影响?
写出一个函数判断给定的目标值是否出现在数组中。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出[3,4,4,5,7,0,1,2]和target=4,返回 true
思想:这个题在数组中出现了重复元素,基本和上题思路一样,只是在遇到a[mid]和a[0]或者a[n]相等时low和high不能再每次折半,每次都只能变化1,因此时间复杂度也会变大。代码如下:
public class Solution {
/**
* param A : an integer ratated sorted array and duplicates are allowed
* param target : an integer to be search
* return : a boolean
*/
public static boolean search(int[] a, int target)
{
if (a.length == 0)
return false;
if (a[0] == target)
return true;
if (a[a.length - 1] == target)
return true;
int low = 0;
int high = a.length - 1;
int mid;
int n = a.length - 1;
while (low < high)
{
mid = (low + high) / 2;
if (a[mid] == target)
return true;
if (a[mid] > target)
{
if (a[mid] < a[n])
high = mid - 1;
if (a[mid] == a[n])
high--;
if (a[mid] > a[0] && target > a[0])
high = high - 1;
if (a[mid] > a[0] && target < a[0])
low = mid + 1;
}
if (a[mid] < target)
{
if (a[mid] < a[n] && target < a[n])
low = mid + 1;
if (a[mid] < a[n] && target > a[n])
high = mid - 1;
if (a[mid] > a[0])
low = mid + 1;
if (a[mid] == a[0])
low++;
}
}
return false;
}
}
做的算法题不多,有更好的思想,欢迎交流分享!!!