對(duì)于數(shù)組 A=[10, 2, 11, 13, 1, 1, 1, 1, 1], 找不到能把數(shù)組四等分的下標(biāo),所以函數(shù)應(yīng)該返回false。
第一次寫博客,這是阿里上機(jī)筆試,僅作為交流用,切勿抄襲。對(duì)于這道題,本人思考一個(gè)小時(shí),想用O(n)算法解決,但最后還是僅僅做到O(nlogn)的一個(gè)算法,哎,只能服了自己的智商,如果有O(n)時(shí)間的算法可以解決此問題,還請(qǐng)不吝賜教
核心思想:左右累加,標(biāo)記前行。八個(gè)字概括這個(gè)算法,兩端累加是基礎(chǔ),但是兩端累加和相等時(shí)并不一定是四分點(diǎn),所以只能標(biāo)記之后再往后判斷
public static boolean attemp(int[] A,int m1,int m3,int target) { int left_A_sum = A[m1+1]; int right_A_sum = A[m3-1]; int low = m1; int high =m3; for(low+=1,high-=1; low<high; ){ if(low+1 == high) break;//不可劃分 if(left_A_sum == target && left_A_sum == right_A_sum && low+1 == high-1)//正確劃分 return true; if(left_A_sum == target && left_A_sum == right_A_sum && low+1 != high-1)//錯(cuò)誤劃分 return false; if(left_A_sum > target) break;//超出判斷范圍 if(left_A_sum < target){//防止 left_A_sum == right_A_sum 死循環(huán) left_A_sum += A[low+1]; low++; } if(left_A_sum < right_A_sum){//正常判斷 left_A_sum += A[low+1]; low++; }else if(right_A_sum < left_A_sum){ right_A_sum += A[high-1]; high--; } } return false;} static boolean resolve(int[] A) { //扣掉三個(gè)值:m1,m2,m3得到四等分,所以首先兩頭的必是從邊界開始累加的 boolean result = false; int A_length = A.length; int left_A_sum = A[0]; int right_A_sum = A[A_length - 1]; int low = 0, high= A_length-1; int m1=-1,m2=-1,m3=-1; while(low<high){ if(left_A_sum == right_A_sum){ //進(jìn)行一次劃分嘗試 if(low+1 == high-1)//不可劃分表示不可四等分 return result; else if(attemp(A,low+1,high-1,left_A_sum)){//劃分成功 System.out.PRintln("m1:"+(low+1)+"---"+"m3:"+(high-1)+"劃分正確"); return true; }else{ //劃分失敗,則用m1標(biāo)記失敗處,往后查找可行劃分元 m1 = low + 1; m3 = high - 1; left_A_sum += A[low + 1]; right_A_sum += A[high - 1]; low++; high--; System.out.println("m1:"+m1+"---"+"m3:"+m3+"劃分錯(cuò)誤"); continue; } } if(left_A_sum < right_A_sum){ left_A_sum += A[low+1]; low++; }else if(right_A_sum < left_A_sum){ right_A_sum += A[high-1]; high--; } } return result; }
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注