当前位置: 首页 > 后端技术 > Java

SearchinRotatedSortedArray-Circularorderedarraysearchproblem

时间:2023-04-01 23:01:37 Java

两道题SearchinRotatedSortedArrayhttps://leetcode.com/problems...SearchinRotatedSortedArrayIIhttps://leetcode.com/problems..这些两题属于循环有序数组的搜索问题。无论是查找特定元素的下标,还是检查目标值是否在数组中,主要的判断逻辑都是一样的。思路将有序数组翻转为循环有序数组的解决方法是对原数组进行分段。使用首元素start、中间元素mid、尾元素end,可以将数组分为两个子数组s1、s2。那么在这两个子数组中,必须至少有一个子数组是有序的。那么如何确定哪个部分是有序的呢?通过分析可以看出只有三种情况:当start为A中的最小元素时,不等式成立:start<=mid<=end当最小值在(start,mid]时,则有:mid<=end<=start当最小值出现在(mid,end]中,则有:end<=start<=mid所以通过start,mid,end的大小关系,可以判断s1和s2是哪个是有序的,通过比较目标target与start,mid,end的大小关系,可以知道目标在哪个子数组中,如果目标在有序的子数组中,可以使用二分查找,否则,对无序子数组重复刚才的过程。代码包com.lingyejun.dating.chap11.toutiao;publicclassRotatedArrayQuery{/***33.在旋转排序数组中搜索*搜索目标值下标**@paramnums*@paramtarget*@return*/publicintsearchTargetIndex(int[]nums,inttarget){intstart=0;intend=nums.length-1;while(start<=end){//(start...middle...end)intmid=(start+end)/2;if(nums[mid]==target){returnmid;}//数组的前半部分是有序的if(nums[start]=nums[start]){//将原数组减半,取出数组的前半部分end=mid-1;}else{//目标在数组的后半部分start=mid+1;}}//数组的后半部分是有序的elseif(nums[mid]nums[mid]&&target<=nums[end]){//将原数组减半,取出数组的后半部分start=mid+1;}else{//目标在数组的前半部分end=mid-1;}}else{//这个场景{1,0,1,1,1}start=mid=endstart++;}}返回-1;}/***81.在旋转排序数组中查找二**查找是否有目标值**@paramnums*@paramtarget*@return*/publicstaticbooleansearchExistsKey(intnums[],inttarget){int开始=0;intend=nums.length-1;while(start<=end){intmid=(start+end)/2;如果(nums[mid]==target){返回真;}if(nums[start]nums[mid]){if(nums[mid]