予算



問題を読むと、私はこの探索と才能を利用して答えたいと思っています.
問題解決段階の設計はこうである.
  • 因子で受信した申請金額の配列dの和がサポート金額予算以下である場合、d.lengthを返して終了する.
  • そうでなければ、申請金額をソートし、sliceで新しいhalfarrとクリップ後の残りの配列restarrを生成します.
  • halfarrのすべての要素の和がサポート金額より小さい場合、
    --実行-halfisSmall()再帰->
    --3-1. さらにrestarrを半分に切り、halfarrとrestarrの前半を合わせます.
    --3-2. 次に、連結後の要素がサポート金額より大きくなるまで再実行します.
    --3-3. 大きくなるとlastIndexを繰り返し削除し、並べ替えた金額の和がサポート金額より小さくなるまで、条件に達したら並べ替えます.length return
  • elseのサポート金額より大きい場合は、
    halfisBig()再帰の実行->
    逆にhalfarrを半分に切り、再帰
  • を実行する.
    コードはこうです.
    function solution(d, budget) {
        let sum = d.reduce((a,b)=>a+b);
        if(sum <= budget) return d.length;
        
    // 함수선언 영역
        const arrSlice = (origin)=>{
        //배열을 반으로 잘라 반과 나머지배열을 각각 return해주는 함수
            const halfArr = origin.slice(0, Math.ceil(origin.length/2));
            const restArr = origin.slice(Math.ceil(origin.length/2));
            return [halfArr, restArr];
        }
    
        const halfIsSmall = (half, rest)=>{
            let standard = half.reduce((a,b)=>a+b);
            let result = half.length;
            if(standard > budget){
                while(standard > budget){
                    standard -= half[result-1];
                    result--;
                }
                return result;
            }else{
                [halfArr, restArr] = arrSlice(rest);
                const halfPlusRest = half.concat(halfArr);
                return halfIsSmall(halfPlusRest, restArr);
            }
    
        }
        const halfIsBig = (half, rest)=>{
            let standard = half.reduce((a,b)=>a+b);
            let result = half.length;
            if(standard < budget){
                while(standard < budget){
                    standard += rest[0];
                    result++;
                }
                return result-1;
            }else{
                [halfArr, restArr] = arrSlice(half);
                const restPlusHalf = rest.concat(restArr);
                return halfIsBig(halfArr, restPlusHalf);
            }
        }
        
        
        // 코드시작, 정렬된 sortArr의 halfArr 총 합이 지원금액보다 작다면
        // halfIsSmall 재귀함수 실행
        // 크다면 HalfIsBig 실행,
        let sortArr = d.sort((a,b)=>a-b);
        [halfArr, restArr] = arrSlice(sortArr);
        const halfsum = halfArr.reduce((a,b)=>a+b);
    
        if(halfsum === budget) return halfArr.length;
        else if(halfsum < budget) return halfIsSmall(halfArr, restArr);
        else return halfIsSmall(halfArr, restArr);
    }
    コミット時にarsliceという関数は使用されません.
    私は条件文の中で直接彼にスライスして、繰り返した部分がまぶしいです.
    メモリやパフォーマンスの問題が改善されるかどうか知りたいです.
    テストケースを例にとると、17回の加速速度は0.76ミリ秒から0.34ミリ秒に2倍に向上した.
    それ以外にも、より高速(0.10ミリ秒から0.35ミリ秒)になる場合があります.
    天井や床によっても少し違います.
    自分の状況に合った最適な人を探しましょう.