【LeetCode】Search in Rotated Sorted Array——旋转有序数列找目标值
【题目】
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
【二分思路】
分情况讨论,数组可能有以下三种情况:
然后,再看每一种情况中,target在左边还是在右边,其中第一种情况还可以直接判断target有可能不在数组范围内。
1 public class Solution { 2 public int search(int[] A, int target) { 3 int len = A.length; 4 if (len == 0) return -1; 5 return binarySearch(A, 0, len-1, target); 6 } 7 8 public int binarySearch(int[] A, int left, int right, int target) { 9 if (left > right) return -1; 10 11 int mid = (left + right) / 2; 12 if (A[left] == target) return left; 13 if (A[mid] == target) return mid; 14 if (A[right] == target) return right; 15 16 //图示情况一 17 if (A[left] < A[right]) { 18 if (target < A[left] || target > A[right]) { //target不在数组范围内 19 return -1; 20 } else if (target < A[mid]) { //target在左边 21 return binarySearch(A, left+1, mid-1, target); 22 } else { //target在右边 23 return binarySearch(A, mid+1, right-1, target); 24 } 25 } 26 //图示情况二 27 else if (A[left] < A[mid]) { 28 if (target > A[left] && target < A[mid]) { //target在左边 29 return binarySearch(A, left+1, mid-1, target); 30 } else { //target在右边 31 return binarySearch(A, mid+1, right-1, target); 32 } 33 } 34 //图示情况三 35 else { 36 if (target > A[mid] && target < A[right]) { //target在右边 37 return binarySearch(A, mid+1, right-1, target); 38 } else{ //target在左边 39 return binarySearch(A, left+1, mid-1, target); 40 } 41 } 42 } 43 }
我的解法,不是最优解
1 class Solution { 2 public: 3 int search(int A[], int n, int target) { 4 if(A==NULL||n<1) return -1; 5 int index=0; 6 for(int i=1;i<n;i++){ 7 if(A[i-1]>A[i]){ 8 index=i; 9 break; 10 } 11 } 12 int left,right; 13 if(target>=A[0]&&target<=A[index-1]){ 14 left=0; 15 right=index-1; 16 }else if(target>=A[index]&&target<=A[n-1]){ 17 left=index; 18 right=n-1; 19 }else 20 return -1; 21 while(left<=right){ 22 int mid=(left+right)/2; 23 if(target==A[left]) 24 return left; 25 if(target==A[right]) 26 return right; 27 if(target==A[mid]) 28 return mid; 29 if(target>A[left]&&target<A[mid]){ 30 left++; 31 right=mid-1; 32 }else{ 33 right--; 34 left=mid+1; 35 } 36 } 37 return -1; 38 } 39 };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了