LeetCode題目鏈接鏈接
https://leetcode-cn.com/problems/search-in-rotated-sorted-array/
假設(shè)按照升序排序的數(shù)組在預(yù)先未知的某個點上進(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):常量階寒瓦,運行時間為常量
(2)O(logn):對數(shù)階,如二分搜索算法
(3)O(n):線性階坪仇,如n個數(shù)內(nèi)找最大值
(4)O(nlogn):對數(shù)階杂腰,如快速排序算法
(5)O(n^2):平方階,如選擇排序椅文,冒泡排序
(6)O(n^3):立方階喂很,如兩個n階矩陣的乘法運算
(7)O(2^n):指數(shù)階皆刺,如n個元素集合的所有子集的算法
(8)O(n!):階乘階,如n個元素全部排列的算法
對于O(logn)羡蛾,可以參照下面的博客鏈接
[收藏]時間復(fù)雜度 O(log n) 意味著什么漓帅? - [| 小人物痴怨,大世界 - CSDN博客
分析:
其實這道理只要找對分類情況的話,就很簡單了腿箩。但是這個情況不好找。
由于數(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;
? ? }
}