知識點:數組,二分查找;java
已知存在一個按非降序排列的整數數組 nums ,數組中的值沒必要互不相同。數組
在傳遞給函數以前,nums 在預先未知的某個下標 k(0 <= k < nums.length)上進行了 旋轉 ,使數組變爲 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下標 從 0 開始 計數)。例如, [0,1,2,4,4,4,5,6,6,7] 在下標 5 處經旋轉後可能變爲 [4,5,6,6,7,0,1,2,4,4] 。函數
給你 旋轉後 的數組 nums 和一個整數 target ,請你編寫一個函數來判斷給定的目標值是否存在於數組中。若是 nums 中存在這個目標值 target ,則返回 true ,不然返回 false 。code
輸入:nums = [2,5,6,0,0,1,2], target = 0 輸出:true 輸入:nums = [2,5,6,0,0,1,2], target = 3 輸出:false
這道題目和33題惟一的區別就在於這道里數組元素不是惟一的,也就是有重複元素。這就會在以前的解法上產生一個問題,就是沒有辦法再根據mid的值判斷哪部分是有序的了。好比
10111 和 11101這種。此種狀況下 nums[left] == nums[mid],分不清究竟是前面有序仍是後面有序,此時只須要讓left++ 便可。至關於去掉一個重複的干擾項。排序
class Solution { public boolean search(int[] nums, int target) { if(nums == null) return false; int left = 0, right = nums.length-1; while(left <= right){ int mid = left + ((right-left) >> 1); if(nums[mid] == target) return true; if(nums[mid] == nums[left]) { left++; continue; //去掉干擾項; } if(nums[mid] > nums[left]){ if(target >= nums[left] && target < nums[mid]){ right = mid-1; }else{ left = mid+1; } }else if(nums[mid] < nums[left]){ if(target > nums[mid] && target <= nums[right]){ left = mid+1; }else{ right = mid-1; } } } return false; } }
搜索旋轉排序數組IIleetcode