亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

一個數組先升序再降序,用最優時間復雜度,求最大值?例如[1,2,2,2,2,3,1]

一個數組先升序再降序,用最優時間復雜度,求最大值?例如[1,2,2,2,2,3,1]

江戶川亂折騰 2019-05-11 16:26:52
一個數組先升序再降序,求最大值?例如[1,2,2,2,2,3,1],用最優時間復雜度,算法實現獲取最大值3
查看完整描述

2 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

===更新去掉了遞歸、數組復制,函數返回值改為索引以方便處理空數組的情況
publicclassMaxFinder{
publicstaticvoidmain(String[]args){
int[]arr={2,3,3,3,7,13,22};
System.out.println(arr[getMaxPos(arr)]);
}
publicstaticintgetMaxPos(int[]arr){
intlen=arr.length;
if(len>=2){
intmin=0,
max=len-1;//最大值位置的索引范圍閉區間
intmid,left;
while(max-min>1){
mid=min+(max-min)/2;
left=mid-1;
while(left>=min){
if(arr[left]>arr[mid]){
max=left;
break;
}elseif(arr[left]min=mid;
break;
}else{
if(left==min){
min=mid;
}
left--;
}
}
}
returnarr[max]>arr[min]?max:min;
}elseif(len==1){
return0;
}else{
return-1;
}
}
}
===原答案
publicclassTest{
publicstaticvoidmain(String[]args){
int[]arr={1,2,2,2,2,3,1};
System.out.println(getMax(arr));
}
publicstaticintgetMax(int[]arr){
intlen=arr.length;
if(len>2){
intmid=len/2,
left=mid-1;
while(left>=0){
if(arr[left]>arr[mid]){
returngetMax(Arrays.copyOfRange(arr,0,left+1));
}elseif(arr[left]returngetMax(Arrays.copyOfRange(arr,mid,arr.length));
}else{
left--;
}
}
//comehereonlyifarr[0]toarr[mid]areallthesame
returngetMax(Arrays.copyOfRange(arr,mid,arr.length));
}elseif(len==2){
returnarr[0]>arr[1]?arr[0]:arr[1];
}else{
returnarr[0];
}
}
}
                            
查看完整回答
反對 回復 2019-05-11
?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

/**
*使用二分查找法
*@paramarr:先升序在降序的數組
*@paramlow:數組最小的索引
*@paramhigh:數組最大的索引
*@return:返回數組中的最大值
*/
publicstaticintgetMax(int[]arr,intlow,inthigh){
while(low{
intmid=low+((high-low)>>1);
if(arr[mid]>arr[mid+1]){
high=mid;
}
elseif(arr[mid]low=mid+1;
}
else//arr[mid]和arr[mid+1]相等的情況
{
if(mid-1>=low)//防止數組范圍越界[low~high]
{
if(arr[mid-1]>arr[mid])
{
high=mid-1;
}
elseif(arr[mid-1]{
low=mid+1;
}
else//如果arr[mid-1]和arr[mid]相等,即arr[mid-1],arr[mid],arr[mid+1]都相等,
//那么就不能確定最大值在mid左邊還是在mid右邊,所以分別對mid左邊和mid右邊遞歸求最大
//值,然后比較
{
intone=getMax(arr,low,mid-1);
inttwo=getMax(arr,mid+1,high);
returnone>two?one:two;
}
}
else{//如果mid-1returnarr[low];
}
}
}
returnarr[low];
}
                            
查看完整回答
反對 回復 2019-05-11
  • 2 回答
  • 0 關注
  • 823 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號