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;

}

}

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容