国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

數(shù)組四等分

2019-11-06 06:24:51
字體:
供稿:網(wǎng)友
       對(duì)于一個(gè)長(zhǎng)度為N的整型數(shù)組A, 數(shù)組里所有的數(shù)都是正整數(shù),對(duì)于兩個(gè)滿足0<=X <= Y <N的整數(shù),A[X], A[X+1] … A[Y]構(gòu)成A的一個(gè)切片,記作(X, Y)。用三個(gè)下標(biāo) m1, m2, m3下標(biāo)滿足條件 0 < m1, m1 + 1 < m2, m2 +1 < m3 < N – 1??梢园堰@個(gè)整型數(shù)組分成(0, m1-1), (m1+1, m2-1), (m2+1, m3-1), (m3+1, N-1) 四個(gè)切片。如果這四個(gè)切片中的整數(shù)求和相等,稱作“四等分”。編寫一個(gè)函數(shù),求一個(gè)給定的整型數(shù)組是否可以四等分,如果可以,返回一個(gè)布爾類型的true,如果不可以返回一個(gè)布爾類型的false。限制條件: 數(shù)組A最多有1,000,000項(xiàng),數(shù)組中的整數(shù)取值范圍介于-1,000,000到1,000,000之間。要求: 函數(shù)的計(jì)算復(fù)雜度為O(N),使用的額外存儲(chǔ)空間(除了輸入的數(shù)組之外)最多為O(N)。例子:對(duì)于數(shù)組A=[2, 5, 1, 1, 1, 1, 4, 1, 7, 3, 7] 存在下標(biāo) 2, 7, 9使得數(shù)組分成四個(gè)分片[2, 5], [1, 1, 1, 4], [7], [7],這三個(gè)分片內(nèi)整數(shù)之和相等,所以對(duì)于這個(gè)數(shù)組,函數(shù)應(yīng)該返回true。

對(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;   }


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 南江县| 镇原县| 乡城县| 肃南| 巴东县| 洛阳市| 贞丰县| 克什克腾旗| 闻喜县| 建湖县| 科技| 阿荣旗| 滕州市| 新昌县| 宜黄县| 昔阳县| 岐山县| 赤水市| 资兴市| 中方县| 定日县| 峨边| 错那县| 杭锦旗| 明光市| 秭归县| 克山县| 绵竹市| 房产| 吴堡县| 嘉义县| 缙云县| 乳山市| 五华县| 克拉玛依市| 焦作市| 且末县| 和平区| 泉州市| 全椒县| 泰顺县|