搜索旋轉(zhuǎn)排序數(shù)組1:
假設(shè)有一個排序的按未知的旋轉(zhuǎn)軸旋轉(zhuǎn)的數(shù)組(比如,0 1 2 4 5 6 7可能成為4 5 6 7 0 1 2)备畦。給定一個目標(biāo)值進(jìn)行搜索忘嫉,如果在數(shù)組中找到目標(biāo)值返回數(shù)組中的索引位置,否則返回-1吏廉。
你可以假設(shè)數(shù)組中不存在重復(fù)的元素笋庄。
您在真實的面試中是否遇到過這個題效扫?
Yes
樣例
給出[4, 5, 1, 2, 3]和target=1,返回 2
給出[4, 5, 1, 2, 3]和target=0直砂,返回 -1
思想:這個題練習(xí)的是二分查找菌仁,首先找到最中間的數(shù)a[mid],將a[mid]和target比較大小静暂,再讓a[mid]和target分別和a[0]和a[n]比較大小济丘,來確定low和high應(yīng)該往哪個方向移動。思想就是這樣籍嘹,代碼如下:
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;
}
}
搜索旋轉(zhuǎn)排序數(shù)組2:
跟進(jìn)“搜索旋轉(zhuǎn)排序數(shù)組”闪盔,假如有重復(fù)元素又將如何?
是否會影響運行時間復(fù)雜度辱士?
如何影響?
為何會影響听绳?
寫出一個函數(shù)判斷給定的目標(biāo)值是否出現(xiàn)在數(shù)組中颂碘。
您在真實的面試中是否遇到過這個題?
Yes
樣例
給出[3,4,4,5,7,0,1,2]和target=4,返回 true
思想:這個題在數(shù)組中出現(xiàn)了重復(fù)元素头岔,基本和上題思路一樣塔拳,只是在遇到a[mid]和a[0]或者a[n]相等時low和high不能再每次折半,每次都只能變化1峡竣,因此時間復(fù)雜度也會變大靠抑。代碼如下:
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;
}
}
做的算法題不多,有更好的思想适掰,歡迎交流分享K瘫獭!类浪!