整数配列 nums が指定された場合、i
O(n) の時間計算量と O(1) の空間計算量で実行されるソリューションを実装できますか?
この問題を効率的に解決するには、これまでに見つかった最小値と 2 番目に小さい値を追跡する必要があります。 2 番目に小さい値より大きい 3 番目の値が見つかった場合、増加する 3 つの値が見つかったことになります。
総当たりの解決策には、考えられるすべてのトリプレットをチェックして、条件 i コード:
function increasingTripletBruteForce(nums: number[]): boolean { const n = nums.length; for (let i = 0; i < n - 2; i++) { for (let j = i + 1; j < n - 1; j++) { for (let k = j + 1; k < n; k++) { if (nums[i] < nums[j] && nums[j] < nums[k]) { return true; } } } } return false; }
総当たりソリューションは効率的ではなく、大きな入力サイズには適していません。
最適化されたソリューションには、これまでに検出された最小値と 2 番目に小さい値を表す 2 つの変数 (1 番目と 2 番目) を維持しながら配列を反復処理することが含まれます。秒より大きい値が見つかった場合は、true を返します。
function increasingTriplet(nums: number[]): boolean { let first = Infinity; let second = Infinity; for (let num of nums) { if (num <= first) { first = num; // smallest value } else if (num <= second) { second = num; // second smallest value } else { return true; // found a value greater than second smallest, thus an increasing triplet exists } } return false; }
console.log(increasingTripletBruteForce([1,2,3,4,5])); // true console.log(increasingTripletBruteForce([5,4,3,2,1])); // false console.log(increasingTripletBruteForce([2,1,5,0,4,6])); // true console.log(increasingTripletBruteForce([1,1,1,1,1])); // false console.log(increasingTripletBruteForce([1,2])); // false console.log(increasingTripletBruteForce([1,2,3])); // true console.log(increasingTripletBruteForce([1,5,0,4,1,3])); // true console.log(increasingTriplet([1,2,3,4,5])); // true console.log(increasingTriplet([5,4,3,2,1])); // false console.log(increasingTriplet([2,1,5,0,4,6])); // true console.log(increasingTriplet([1,1,1,1,1])); // false console.log(increasingTriplet([1,2])); // false console.log(increasingTriplet([1,2,3])); // true console.log(increasingTriplet([1,5,0,4,1,3])); // true
サブ配列の問題:
ツーポイントテクニック:
インプレースアルゴリズム:
このような問題と戦略を実践することで、問題解決スキルを向上させ、さまざまなコーディングの課題に対する準備を整えることができます。
以上がTypescript コーディング クロニクル: トリプレット サブシーケンスの増加の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。