鍍金池/ 問答/人工智能  Java  PHP  Python  Android/ 面試題:x,y,z是一個(gè)整數(shù)數(shù)組的三個(gè)不同的元素,找到所有x = y +z的組合

面試題:x,y,z是一個(gè)整數(shù)數(shù)組的三個(gè)不同的元素,找到所有x = y +z的組合 ?

題目:x,y,z是一個(gè)整數(shù)數(shù)組的三個(gè)不同的元素,找到所有x = y +z的組合,在實(shí)現(xiàn)題目要求的基礎(chǔ)上盡可能使用更優(yōu)的算法.

我的實(shí)現(xiàn)代碼:

$arr = [1, 2, 5, 6, 7];
foreach ($arr as $value) {
    foreach ($arr as $val) {
        if ($val == $value) {
            continue;
        }
        $sum = $value + $val;
        if ($sum != $value && $sum != $val && in_array($sum, $arr)) {
            echo "$sum = $value + $val <br>";
        }
    }
}

還有更優(yōu)的實(shí)現(xiàn)方式嗎?

回答
編輯回答
赱丅呿

稍優(yōu)化了一點(diǎn),按你的算法,有n個(gè)元素的數(shù)組,要循環(huán)

n * n * in_array里的次數(shù),in_array內(nèi)部也是循環(huán)
var arr = [1, 2, 5, 6, 7];//如果這個(gè)數(shù)組不是有序數(shù)組,哪還要先加排序
var len =arr.length

let result=[]
let count=0

for(let a=0;a<len;a++){
let max = arr.pop()
let newlen = arr.length
for(let i=0;i<newlen-1;i++){
   if(arr[i]+arr[i+1]> max){
    break;
  }
  for(let j=i;j<newlen-1;j++){
    let plus = arr[i]+arr[j+1]
    count++
    if(plus>max){
      break;
    }
    if(plus==max){
      result.push([max,arr[i],arr[j+1]])
    }
  }
}
}
console.log(result)//輸出結(jié)果
console.log(count)//輸出總循環(huán)次數(shù),

回復(fù)里說的好,我沒有考慮負(fù)數(shù)的情況,如果要考慮負(fù)數(shù),哪把最大數(shù)pop出來,就不行了,只能重新維護(hù)一條新數(shù)組,用來枚舉所有值,修改如下

var arr = [-8, -1, 1, 2, 5, 6, 7];//如果這個(gè)數(shù)組不是有序數(shù)組,哪還要先加排序
var len =arr.length
var arr1 = [...arr] //復(fù)制一條新數(shù)組
let result=[]
let count=0

for(let a=0;a<len;a++){
let max = arr1.pop()// 從新數(shù)組中枚舉各個(gè)值。
let newlen = arr.length
for(let i=0;i<newlen-1;i++){
   if(arr[i]+arr[i+1]> max){
    break;
  }
  for(let j=i;j<newlen-1;j++){
    let plus = arr[i]+arr[j+1]
    count++
    if(plus>max){
      break;
    }
    if(plus==max){
      result.push([max,arr[i],arr[j+1]])
    }
  }
}
}
console.log(result)//輸出結(jié)果
console.log(count)//輸出總循環(huán)次數(shù),
輸出
[[7, 1, 6], [7, 2, 5], [6, -1, 7], [6, 1, 5], [5, -1, 6], [1, -1, 2], [-1, -8, 7]]
2017年6月4日 22:37