將傳統的問題進行一些稍微的變形,這個時候咱們可能無所適從了,所以仍是實踐出真知,多練習多總結多思考。java
題目限制了時間複雜度爲O(log(n)),剛遇到這個題目的時候咱們可能會感到眩暈,由於若是是正常的二分查找算法咱們固然能夠很快的寫出代碼,可是這裏由於是兩節從小到大排序的數字,而且互不相交,咱們就不知道要怎麼辦了,其實仔細想一下仍是使用二分查找算法,找到中間點,只須要拿中間的元素和兩邊的比較就能知道這個中間的元素是屬於那一節的了,以後咱們就能夠看看咱們要找的元素是否是在這個節以內,而後調整指針,通過一次調整以後,之後的查找就和以前的二分查找一個樣子了。這是很是有趣的。那假如說咱們的兩節變成三節呢?這樣的判斷就比較麻煩了,當咱們和最後的比,若是大於最後的,那肯定不是最後一節的,可是小於的話,咱們就不能判斷了。算法
public class Solution { public int search(int[] nums, int target) { int start = 0; int end = nums.length - 1; while (start <= end){ int mid = (start + end) / 2; if (nums[mid] == target) return mid; if (nums[start] <= nums[mid]){ if (target < nums[mid] && target >= nums[start]) end = mid - 1; else start = mid + 1; } if (nums[mid] <= nums[end]){ if (target > nums[mid] && target <= nums[end]) start = mid + 1; else end = mid - 1; } } return -1; } }
遇到這樣的問題的時候,最好是拿出一張紙畫一個圖,而後按照原始的方法不斷地擴展下去,這樣能夠更快的找到答案。spa