生活随笔
收集整理的這篇文章主要介紹了
【LeetCode笔记】33. 搜索旋转排序数组(Java、二分法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
題目描述
思路 & 代碼
- 重點在于保證O(logn)的時間復雜度
- 看成兩個數組:前半段 & 后半段。根據兩個數組的極值來判斷 target 在哪個數組,再進行判斷即可。
- 先一次二分,找到前半段、后半段的分界下標。
- 再一次二分,找到在某半段中的 target
- 注意:要考慮極端情況:在下標0處旋轉,相當于沒有旋轉。
class Solution {public int search(int[] nums
, int target
) {int k
= -1, low
= 0, top
= nums
.length
- 1;while(low
<= top
){k
= (low
+ top
) / 2;if(k
+ 1 == nums
.length
|| nums
[k
] > nums
[k
+ 1]){break;}if(nums
[k
] < nums
[0]){top
= k
- 1;}else{low
= k
+ 1;} }if(target
> nums
[nums
.length
-1] || k
== nums
.length
-1){return binary(nums
,0,k
,target
);}else{return binary(nums
,k
+1,nums
.length
-1,target
);}}public int binary(int[] nums
,int left
,int right
,int target
){if(left
>= right
){if(target
== nums
[left
]){return left
;}return -1;}int half
= (left
+right
)/2;if(target
== nums
[half
]){return half
;}else if(target
> nums
[half
]){return binary(nums
,half
+1,right
,target
);}else{return binary(nums
,left
,half
-1,target
);}}
}
更新版
class Solution {public int search(int[] nums
, int target
) {int k
= -1;int left
= 0, right
= nums
.length
- 1;while(left
<= right
) {k
= (left
+ right
) / 2;if(k
+ 1 == nums
.length
|| nums
[k
] > nums
[k
+ 1]) {break;}if(nums
[k
] < nums
[0]) {right
= k
- 1;}else {left
= k
+ 1;}}if(target
> nums
[nums
.length
- 1] || k
== nums
.length
- 1) {return binary(nums
, 0, k
, target
);}else {return binary(nums
, k
+ 1, nums
.length
- 1, target
);}}public int binary(int[] nums
, int left
, int right
, int target
) {if(left
> right
) {return -1;}int mid
= (left
+ right
) / 2;if(target
== nums
[mid
]) {return mid
;}else if(nums
[mid
] > target
) {return binary(nums
, left
, mid
- 1, target
);}else {return binary(nums
, mid
+ 1, right
, target
);}}
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的【LeetCode笔记】33. 搜索旋转排序数组(Java、二分法)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。