1. 程式人生 > >劍指offer-和為S的兩個數

劍指offer-和為S的兩個數

題目如下:

輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。
輸出描述:
對應每個測試案例,輸出兩個數,小的先輸出

解題思路:

  1. 遍歷陣列中的每一項,對每一項進行如下操作
  2. 當前項為n1,用S - n1 得到 nextHalf
  3. 如果nextHalf 小於等於當前值n1,退出迴圈
  4. 如果nextHalf大於當前值,在陣列中查詢nextHalf
  5. 如果找到nextHalf,就將n1和nextHalf以及兩者的乘積進行儲存
  6. 沒有找到nextHalf那就continue當前迴圈
  7. 最後根據得到結果中的乘積進行過濾
function FindNumbersWithSum(array, sum)
{
    let resArr =[];
    for(var i = 0 ;i < sum ; i++){
        //和的另一半
        let  nextHalf = sum - array[i];
        //如果和的另一半小於當前值,退出迴圈
        if( nextHalf <= array[i] ){
            break;
        }else{
            //如果能找到另一半
            if( array.indexOf(nextHalf) > -1 ){
                resArr.push({
                    min: array[i],
                    next: nextHalf,
                    mult: array[i] * nextHalf
                })
            }
        }
    }
    if(resArr.length === 0){
    	return [];
    }
    let multArr = resArr.map((val)=>{
        return val.mult;                     
    });
    
    let index = multArr.indexOf( Math.min(...multArr) );
    return [resArr[index].min, resArr[index].next];    
}