「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Typescript コーディング クロニクル: トリプレット サブシーケンスの増加

Typescript コーディング クロニクル: トリプレット サブシーケンスの増加

2024 年 7 月 30 日に公開
ブラウズ:114

Typescript Coding Chronicles: Increasing Triplet Subsequence

問題文:

整数配列 nums が指定された場合、i

例 1:

  • 入力: 数値 = [1,2,3,4,5]
  • 出力: true
  • 説明: i

例 2:

  • 入力: 数値 = [5,4,3,2,1]
  • 出力: false
  • 説明: トリプレットは存在しません。

例 3:

  • 入力: 数値 = [2,1,5,0,4,6]
  • 出力: true
  • 説明: nums[3] == 0

制約:

  • 1
  • -2^31

フォローアップ:

O(n) の時間計算量と O(1) の空間計算量で実行されるソリューションを実装できますか?

最初の思考プロセス:

この問題を効率的に解決するには、これまでに見つかった最小値と 2 番目に小さい値を追跡する必要があります。 2 番目に小さい値より大きい 3 番目の値が見つかった場合、増加する 3 つの値が見つかったことになります。

基本的な解決策 (総当たり):

ブルート フォース ソリューションでは、考えられるすべてのトリプレットをチェックして、条件 i

コード:

function increasingTripletBruteForce(nums: number[]): boolean {
    const n = nums.length;
    for (let i = 0; i 



時間計算量の分析:

  • 時間計算量: O(n^3)、n は配列の長さです。これは、考えられるすべてのトリプレットをチェックしているためです。
  • スペースの複雑さ: O(1)。余分なスペースを使用していないためです。

制限事項:

ブルート フォース ソリューションは効率的ではなく、大きな入力サイズには適していません。

最適化されたソリューション:

最適化されたソリューションには、これまでに検出された最小値と 2 番目に小さい値を表す 2 つの変数 (1 番目と 2 番目) を維持しながら配列を反復処理することが含まれます。秒より大きい値が見つかった場合は、true を返します。

コード:

function increasingTriplet(nums: number[]): boolean {
    let first = Infinity;
    let second = Infinity;

    for (let num of nums) {
        if (num 



時間計算量の分析:

  • 時間計算量: O(n)、n は配列の長さです。配列を 1 回反復処理します。
  • スペースの複雑さ: O(1)。一定量の追加スペースのみを使用しているためです。

基本的なソリューションの改善点:

  • このソリューションは線形時間で実行され、一定の空間を使用するため、特定の制約に対して最適化されます。

エッジケースとテスト:

エッジケース:

  1. 配列は降順です。
  2. 配列には、昇順で正確に 3 つの要素が含まれています。
  3. 配列には、増加するトリプレットのない多数の要素があります。
  4. 配列には重複が含まれています。

テストケース:

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

一般的な問題解決戦略:

  1. 問題を理解する: 問題の説明を注意深く読み、要件と制約を理解します。
  2. キー操作の特定: 最小値と 2 番目に小さい値の追跡など、必要なキー操作を決定します。
  3. 効率を最適化: 効率的なアルゴリズムとデータ構造を使用して、時間と空間の複雑さを最小限に抑えます。
  4. 徹底的にテストします: エッジケースを含むさまざまなケースでソリューションをテストし、正確さを確認します。

同様の問題を特定する:

  1. サブ配列の問題:

    • 特定のプロパティを持つ部分配列を見つける必要がある問題。
    • 例: 最大合計部分配列の検索 (Kadane のアルゴリズム)。
  2. ツーポイントテクニック:

    • 2 つのポインターを使用すると解決策の最適化に役立つ問題。
    • 例: ソートされた配列から重複を削除します。
  3. インプレース アルゴリズム:

    • 限られた追加スペースで操作を適切な場所で実行する必要がある問題。
    • 例: 配列を右に k ステップ回転します。

結論:

  • 増加する三重項部分列を見つける問題は、力ずくのアプローチと、線形時間と一定空間の複雑さを備えた最適化されたソリューションの両方を使用して効率的に解決できます。
  • 問題を理解し、管理可能な部分に分割することが重要です。
  • 効率的なアルゴリズムを使用することで、大規模な入力に対してソリューションが最適になることが保証されます。
  • さまざまなエッジケースでのテストにより、堅牢性が保証されます。
  • 問題のパターンを認識すると、同様の解決策を他の課題に適用するのに役立ちます。

このような問題と戦略を実践することで、問題解決スキルを向上させ、さまざまなコーディングの課題に対する準備を整えることができます。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/__zamora__/typescript-coding-chronicles-increasing-triplet-subsequence-207l?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3