leetcode 33 搜索旋转排序数组 到处是细节的好题
生活随笔
收集整理的這篇文章主要介紹了
leetcode 33 搜索旋转排序数组 到处是细节的好题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這個題想了想就會做,只是細節真的能卡死人,找了好久的bug。甚至我懷疑我現在的代碼可能還有錯,只是沒例子測出來。
假設按照升序排序的數組在預先未知的某個點上進行了旋轉。
( 例如,數組?[0,1,2,4,5,6,7]?可能變為?[4,5,6,7,0,1,2]?)。
搜索一個給定的目標值,如果數組中存在這個目標值,則返回它的索引,否則返回?-1?。
你可以假設數組中不存在重復的元素。
你的算法時間復雜度必須是?O(log?n) 級別。
示例 1:
輸入: nums = [4,5,6,7,0,1,2], target = 0
輸出: 4
示例?2:
輸入: nums = [4,5,6,7,0,1,2], target = 3
輸出: -1
思路:先二分找到旋轉點,然后確定在旋轉點左邊查還是右邊查,再二分查找目標。
需要注意的細節在代碼中標注
class Solution {public int search(int[] nums, int target) {if(nums.length==0)return -1;//坑1if(nums.length==1){//坑2if(nums[0]==target)return 0;return -1;}int left=0;int right=nums.length-1;int index=nums.length-1;//旋轉邊界,坑3,初始化別的值是錯的//確定旋轉邊界while(left<=right){int mid=(right-left)/2+left;if (mid==nums.length-1 || nums[mid] > nums[mid + 1]){//坑4,不加第一個條件會越界index = mid+1;break;}else if(nums[left]<=nums[mid]){//坑5,記得加=left=mid+1;}else{right=mid-1;}}//確定在哪邊二分查找if(target>=nums[0]){//坑6,記得加等于left=0;right=index-1;}else{left=index;right=nums.length-1;}//查找while(left<=right){//坑7,mid直接(right+left)/2可能超過int范圍int mid=(right-left)/2+left;if(nums[mid]<target){left=mid+1;}else if(nums[mid]>target){right=mid-1;}else{return mid;}}return -1;} }?
總結
以上是生活随笔為你收集整理的leetcode 33 搜索旋转排序数组 到处是细节的好题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三个博弈基础
- 下一篇: leetcode217. 存在重复元素(