毎日のアルゴリズム: 有効な三角形の数

毎日のアルゴリズム: 有効な三角形の数

[[429712]]

この記事はWeChatの公開アカウント「3分でフロントエンドを学ぶ」から転載したもので、著者はsisterAnです。この記事を転載する場合は、「3分で学ぶフロントエンド」公式アカウントまでご連絡ください。

負でない整数を含む配列が与えられた場合、三角形の 3 辺を形成できる 3 つ組の数を数えることがタスクです。

例1:

  1. 入力: [2,2,3,4]
  2. 出力: 3
  3. 説明する:
  4. 有効な組み合わせは次のとおりです。
  5. 2、3、4(最初の2つを使用)
  6. 2、3、4(2番目の2を使用)
  7. 2,2,3

知らせ:

  • 配列の長さは 1000 を超えることはできません。
  • 配列内の整数の範囲は[0, 1000]です。

解決策: ソート + ダブルポインタ

三角形のどの2辺の合計も3番目の辺より大きく、どの2辺の差も3番目の辺より小さいことがわかっています。3辺の長さを小さい方から順にa、b、cとすると、これらの3辺はa + b > cの場合にのみ三角形を形成できます。

解決策: 最初に配列をソートし、次に最長のエッジを固定し、ダブル ポインター メソッドを使用して残りのエッジを決定します。

nums[nums.length - 1]を最長辺nums[k]とする(k = nums.length - 1)

nums[i]を最短辺とし、nums[nums.length - 2]を2番目の数nums[j](j = nums.length - 2)とする。

nums[i] + nums[j]がnums[k]より大きいかどうかを判定します。

  • nums[i] + nums[j] > nums[k] の場合、次のようになります。
  1. 数値[i+1] + 数値[j] > 数値[k]
  2. 数値[i+2] + 数値[j] > 数値[k]
  3. ...
  4. 数値[j-1] + 数値[j] > 数値[k]

そして、ji に三角形を形成できる三つ組の数が追加され、j が一つ前の位置 (j--) に移動し、次のラウンドの判定が続行されます。

  • nums[i] + nums[j] <= nums[k]の場合、lは1つ後ろに移動し(numsは昇順)、判定を続けます。

コード実装:

  1. triangleNumber = function (nums) {とします。
  2. if (!nums || nums.length < 3) 0を返す
  3. カウントを 0 にする
  4. // 選別
  5. nums.sort((a, b) => a - b)
  6. (k = nums.length - 1; k > 1; k --)の場合{  
  7. i = 0、j = k - 1とする
  8. i < j の場合{
  9. if(nums[i] + nums[j] > nums[k]){
  10. カウント+= j - i
  11. じ --  
  12. }それ以外{
  13. 私は++
  14. }
  15. }
  16. }
  17. 戻る カウント 
  18. }

複雑性分析:

  • 時間計算量: O(n^2^)
  • 空間計算量: O(n)

知らせ:

Array.prototype.sort() に関しては、ES 仕様では特定のアルゴリズムは指定されていません。バージョン 7.0 より前の V8 エンジンでは、配列の長さが 10 未満の場合、Array.prototype.sort() は挿入ソートを使用し、それ以外の場合はクイックソートを使用します。

クイックソートは安定したソートアルゴリズムではないため、V8 エンジンバージョン 7.0 以降では廃止されました。最悪の場合、時間計算量は O(n2) に低下します。

代わりに、ハイブリッド ソート アルゴリズムである TimSort が使用されます。

この機能アルゴリズムは、もともと Python 言語で使用されていました。厳密に言えば、上記の 10 個のソート アルゴリズムのいずれにも属さず、ハイブリッド ソート アルゴリズムです。

データ量の少ないサブ配列では挿入ソートを使用し、次にマージソートを使用して順序付けられたサブ配列をマージしてソートします。時間の計算量は O(nlogn) です。

リートコード: https://leetcode-cn.com/problems/valid-triangle-number/solution/teng-xun-leetcode611you-xiao-san-jiao-xing-de-ge-s/

<<:  すべてのビジネスデータを使用しても、AI に完全に入力することはできませんか?この小さなサンプル学習キットをお試しください

>>:  科学者たちは人間のように「考える」ことができる人工知能を開発している

ブログ    
ブログ    

推薦する

ビッグデータと人工知能の違いすら分からないのに、あなたはまだトップへの道を歩んでいる

ビッグデータと AI は公平に比較​​できるでしょうか? ある程度は公平ですが、まずはその違いを明確...

AI業界は大きな変化を遂げています。AI科学者がMVPになるには

20 年前、人工知能の研究に興味を持つ人は、主に大学や非営利の AI 研究所に限られていました。 A...

予測: 2019 年に爆発的に普及する 10 の人工知能テクノロジー!

1. 自然言語生成自然言語生成は、データをテキストに変換し、コンピューターがこれまでにない精度でア...

...

ニューラルネットワーク関係抽出のための構文的に敏感なエンティティ表現

ニューラル関係抽出のための構文的に敏感なエンティティ表現。関係抽出タスクの大規模な適用における大きな...

...

人工知能のインダストリー4.0指標8つ

インダストリー 4.0 における AI イニシアチブの主要な運用指標と主要業績評価指標 (KPI) ...

ビジョンから現実へ: ヘルスケアにおける AI の台頭

[51CTO.com速訳]人工知能分野における音声インタラクション、コンピュータビジョン、認知コンピ...

最高裁判所は顔認識に関する司法解釈を発表し、無作為の「顔スキャン」に「ノー」と述べた。

今朝(8日)、第13期全国人民代表大会第5回会議第二回全体会議が開催され、最高人民法院と最高人民検察...

汎用人工知能は存在するのか?

現在、一部の学者は、汎用人工知能を研究したいと言っています。これは、機械翻訳、音声認識、画像の分類と...

AIエンタープライズアプリケーションは成熟しつつある

デロイトは最新の「企業における AI の現状」レポートで、AI 実践の成功を特徴付ける共通点と、達成...

データセンターにおけるAI技術の応用

AI技術はここ数年で進歩しており、データセンターを含む多くの業界で導入されています。たとえば、Goo...

ControlNetの作者が新作を発表:数百万のデータを使ったトレーニング、レイヤー設計の先駆けとなるAI画像生成

画像を生成するための大規模なモデルがコンピュータービジョンやグラフィックスの基礎となっている一方で、...

人工知能の最前線:ブレークスルーの機会と希望

[[253441]]人工知能技術の進歩、産業の革新、産業の発展は、産業の基礎となる人工知能の最先端の...