搜索旋轉排序數組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;
}
}
做的算法題不多,有更好的思想,歡迎交流分享!!!