LintCode搜索旋转排序数组

搜索旋转排序数组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;

}

}

做的算法题不多,有更好的思想,欢迎交流分享!!!

你可能感兴趣的:(LintCode搜索旋转排序数组)