33 搜索旋轉(zhuǎn)排序數(shù)組

LeetCode題目鏈接鏈接

https://leetcode-cn.com/problems/search-in-rotated-sorted-array/

假設(shè)按照升序排序的數(shù)組在預(yù)先未知的某個點(diǎn)上進(jìn)行了旋轉(zhuǎn)。

( 例如,數(shù)組[0,1,2,4,5,6,7]可能變?yōu)閇4,5,6,7,0,1,2])。

搜索一個給定的目標(biāo)值,如果數(shù)組中存在這個目標(biāo)值,則返回它的索引,否則返回-1。

你可以假設(shè)數(shù)組中不存在重復(fù)的元素。

你的算法時間復(fù)雜度必須是O(logn) 級別。

示例 1:

輸入:nums = [4,5,6,7,0,1,2], target = 0輸出:4

示例?2:

輸入:nums = [4,5,6,7,0,1,2], target = 3輸出:-1



在做這道題之前。把時間復(fù)雜度重新理解一下

(1)O(1):常量階,運(yùn)行時間為常量

(2)O(logn):對數(shù)階,如二分搜索算法

(3)O(n):線性階,如n個數(shù)內(nèi)找最大值

(4)O(nlogn):對數(shù)階,如快速排序算法

(5)O(n^2):平方階,如選擇排序,冒泡排序

(6)O(n^3):立方階,如兩個n階矩陣的乘法運(yùn)算

(7)O(2^n):指數(shù)階,如n個元素集合的所有子集的算法

(8)O(n!):階乘階,如n個元素全部排列的算法


對于O(logn),可以參照下面的博客鏈接

[收藏]時間復(fù)雜度 O(log n) 意味著什么? - [| 小人物,大世界 - CSDN博客


分析:

其實(shí)這道理只要找對分類情況的話,就很簡單了。但是這個情況不好找。

由于數(shù)字無論這么翻轉(zhuǎn),總有一個是正序的。另外一個是亂序或者。那么如何判斷是在正序或者亂序呢?整體思路是采用二分法,但是要修改二分法。

二分法?

int binarysearch(int arr[],int key,int left,int right) {

//求中間元素的下標(biāo)

? ? int mid = (left + right) /2;

//數(shù)組內(nèi)不含有指定元素,依據(jù)下標(biāo)的規(guī)則,退出

? ? if (left > right)

return -1;

//查找到指定元素

? ? if (key == arr[mid]) {

return mid;

//當(dāng)查找的元素大于中間下標(biāo)的元素,則改變開始下標(biāo)的位置

? ? }

else if (key > arr[mid]) {

return binarysearch(arr, key, mid +1, right);

}

else {

//當(dāng)查找的元素小于中間下標(biāo)的元素,則改變結(jié)束下標(biāo)的位置

? ? ? ? return binarysearch(arr, key, left, mid -1);

}

}


1. 如果第一位first < mid(first為要尋找的區(qū)間的第一位,mid為要尋找區(qū)間的中間位),

? ? ? ? 如果? first < target < array[mid]? 則該區(qū)間是正序

? ? ? ? 否則? target不在正序區(qū)間

2. 如果第一位first > mid

????如果? first < target < array[mid]?則該區(qū)間是正序

????否則? target不在正序區(qū)間


代碼


class Solution {

? ? public int search(int[] nums, int target) {

? ? ? ? if(nums.length<=0){

? ? ? ? ? ? return -1;

? ? ? ? }


? ? ? ? int first = nums[0];

? ? ? ? if(first == target){

? ? ? ? ? ? return 0;

? ? ? ? }

? ? ? ? int last = nums[nums.length-1];

? ? ? ? if(last == target){

? ? ? ? ? ? return nums.length-1;

? ? ? ? }

? ? ? ? return binarysearch(nums, 0, nums.length-1,target,first, last);

? ? }


? ? public static int binarysearch(int array[], int low, int high, int target,int first,int last) {

? ? ? ? if (low > high) {

? ? ? ? ? ? return -1;

? ? ? ? }

? ? ? ? if (low == high){

? ? ? ? ? ? if (array[low] == target){

? ? ? ? ? ? ? ? return low;

? ? ? ? ? ? }else {

? ? ? ? ? ? ? ? return -1;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? int mid = low + (high - low) / 2;

? ? ? ? if (target == array[mid]){

? ? ? ? ? ? return mid;

? ? ? ? }

? ? ? ? if (first < array[mid]){

? ? ? ? ? ? if (target > first && target < array[mid]){

? ? ? ? ? ? ? ? if (array[mid-1]==target){

? ? ? ? ? ? ? ? ? ? return mid-1;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return binarysearch(array, low, mid-1, target, first,array[mid-1]);

? ? ? ? ? ? }else {

? ? ? ? ? ? ? ? if (array[mid+1]==target){

? ? ? ? ? ? ? ? ? ? return mid+1;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return binarysearch(array, mid + 1, high, target, array[mid+1], last);

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? if (first > array[mid]? ){

? ? ? ? ? ? if (target > array[mid] && target < last){

? ? ? ? ? ? ? ? if (array[mid+1]==target){

? ? ? ? ? ? ? ? ? ? return mid+1;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return binarysearch(array, mid + 1, high, target,array[mid+1], last);

? ? ? ? ? ? }else {

? ? ? ? ? ? ? ? if (array[mid-1]==target){

? ? ? ? ? ? ? ? ? ? return mid-1;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return binarysearch(array, low, mid - 1, target,first, array[mid - 1]);

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return -1;

? ? }

}

結(jié)果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容