旋轉陣列的最小數字:
*把乙個陣列最開始的若干位搬到陣列的末尾,我們稱子為旋轉陣列。輸入乙個遞增排序的旋轉,輸出旋轉陣列中的最小元素。例如陣列為的乙個旋轉,最小元素是1.
直接遍歷也能夠找到最小值,但是這樣沒有用到旋轉的特性,其時間複雜度為o(n),不是優解。
可以把旋轉陣列看成是兩個有序的子陣列,那麼可以用二分查詢的思想的來解決,用兩個指標來分別指向陣列第乙個元素和最後乙個元素,第乙個元素的值一定大於等於最後乙個元素的值(也不完全是,特殊情況是如果把0個元素向後面移動,即還為陣列本身)。
接著我們可以找到中間元素,如果中間元素大於乙個元素,那麼中間元素屬於第乙個子陣列,那麼最小值一定在中間值後面,讓第乙個指標指向中間元素,但任然還 是屬於第乙個陣列,那麼這樣就縮小了搜尋範圍;如果中間元素小於最後乙個元素,那麼中間元素屬於第二個陣列,最小值一定在其前面,讓第二個指標指向中間元素,依然還是屬於第二個陣列的;通樣瘦小了搜尋範圍,重複進行新的一輪查詢,直到兩個指標相鄰,此時第二個指標指向的元素為最小的元素。、
注意:
1、如果把0個元素向後移動,則還為原陣列本身,最小元素為第乙個元素。
2、如果第乙個指標、中間元素、第二個指標指向是值相同,則只能進行順利查詢了。*
**如下:
//找出旋轉陣列的最小元素,應用二分查詢的思想
static int
min(int a,int len)
int index1 = 0;
int index2 = len - 1;
//如果有序數列把0個元素移到到後面去,即旋轉數列為本數列,那麼第乙個元素即為最小
int mid = index1;
while(a[index1] >= a[index2])
//平分為兩個序列
mid = (index1 + index2)/2;
//如果三個的值都相同的,那就只能順利查詢了
if(a[index1] == a[mid] && a[index2] == a[mid])
//mid屬於第乙個數列,index1指向mid
if(a[index1] < a[mid])else
if(a[index2] > a[mid])
//mid屬於第二個數列
index2 = mid;
}return a[mid];
}static int minbyorder(int a, int index1,int index2)
return
min;
}
排序方法
二分查詢
非遞迴實現
static int binsearch(int a,int start,int
end,int key)
intmid = 0;
while(start <= end)
return -1;
}
遞迴實現:
static int binsearchbyback(int a,int start,int
end ,int key)
intmid = (start + end)/2;
if(a[mid] == key)
return mid;
else
if(a[mid] > key)
return binsearchbyback(a,start,mid-1,key);
else
return binsearchbyback(a, mid+1, end, key);
}
快速排序
static int partition(int a,int low,int high)
a[low] = key;
return low;
}
遞迴實現:
static
void quicksort(int a,int low,int high)
}
非遞迴演算法
static void quicksortloop(int a,int low,int high)
stack s = new stack();
intm = partition(a,low,high);
if(low < m-1)
if(m+1
< high)
//其實就是用棧儲存每乙個待排序子串的首尾元素下標,下一次while迴圈時取出這個範圍,對這段子序列進行partition操作
while(!s.empty())
if(end > m+1)
}}
陣列 二分查詢 旋轉陣列的最小數字
1.題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。2.class solution return rotatea...
二分法旋轉陣列找最小數
一 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。note 給出的所有元素都大於0,若陣列大小為0,請返回0。示例1輸入 3,4,5,1,2 返回值1 二 思路 這道題要求用二分法,一開始用的是遍歷的方法,時間...
旋轉陣列的最小數字 二分查詢思想
旋轉陣列的最小數字 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。分析 原始陣列為乙個非遞減排序,因此,我們...