ホームページ > バックエンド開発 > PHPチュートリアル > 。合計が少なくとも K である最短のサブ配列

。合計が少なくとも K である最短のサブ配列

Patricia Arquette
リリース: 2024-11-21 01:04:12
オリジナル
952 人が閲覧しました

. Shortest Subarray with Sum at Least K

862。合計が少なくとも K

である最短の部分配列

難易度: 難しい

トピック: 配列、二分探索、キュー、スライディング ウィンドウ、ヒープ (優先キュー)、プレフィックス合計、モノトニック キュー

整数配列 nums と整数 k を指定すると、合計が少なくとも k である nums の空ではない最短の 部分配列 の長さを返します。そのような サブ配列 がない場合は、-1 を返します。

サブ配列は、配列の連続した部分です。

例 1:

  • 入力: nums = [1]、k = 1
  • 出力: 1

例 2:

  • 入力: nums = [1,2]、k = 4
  • 出力: -1

例 3:

  • 入力: nums = [2,-1,2]、k = 3
  • 出力: 3

制約:

    1 5 -10
  • 5 <= nums[i] <= 105
  • 1 <= k <= 10
  • 9

解決策:

プレフィックス合計と単調キューを組み合わせたスライディング ウィンドウ アプローチを使用する必要があります。段階的なアプローチは次のとおりです:

手順:

  1. プレフィックス合計:

      まず、プレフィックス合計配列を計算します。ここで、インデックス i の各要素は、配列の先頭から i までの要素の合計を表します。接頭辞の合計を使用すると、任意の部分配列の合計を定数時間で計算できます。
  2. モノトニックキュー:

      deque (両端キュー) を使用して、prefix_sum 配列のインデックスを維持します。デキューは、プレフィックス合計の昇順で維持されます。
    • これは、現在のプレフィックスの合計を以前のプレフィックスの合計と比較することにより、合計が k 以上である部分配列を効率的に見つけるのに役立ちます。
  3. スライディング ウィンドウ ロジック:

    • 各インデックス i について、現在のプレフィックス合計と以前のプレフィックス合計 (両端キューに格納されている) の差が k 以上であるかどうかを確認します。
    • その場合、部分配列の長さを計算し、必要に応じて最小長を更新します。

アルゴリズム:

  1. prefix_sum 配列をサイズ n 1 で初期化します (n は入力配列の長さです)。ゼロ要素の合計は 0 であるため、最初の要素は 0 です。
  2. 両端キューを使用して、prefix_sum 値のインデックスを保存します。デキューは、条件を満たす最短のサブ配列を効率的に見つけるのに役立ちます。
  3. 配列内の各要素について、prefix_sum を更新し、両端キューをチェックして、合計が k 以上の最小の部分配列を見つけます。

このソリューションを PHP で実装してみましょう: 862。合計が少なくとも K
である最短の部分配列

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

<!--?php

/**

 * @param Integer[] $nums

 * @param Integer $k

 * @return Integer

 */

function shortestSubarray($nums, $k) {

    ...

    ...

    ...

    /**

     * go to ./solution.php

     */

}

 

// Example usage:

$nums1 = [1];

$k1 = 1;

echo shortestSubarray($nums1, $k1) . "\n"; // Output: 1

 

$nums2 = [1, 2];

$k2 = 4;

echo shortestSubarray($nums2, $k2) . "\n"; // Output: -1

 

$nums3 = [2, -1, 2];

$k3 = 3;

echo shortestSubarray($nums3, $k3) . "\n"; // Output: 3

?-->

 

 

 

 

<h3>

   

   

  説明:

</h3>

 

<ol>

<li>

<p><strong>プレフィックス合計配列:</strong></p>

 

<ul>

<li>prefix_sum 配列内の配列の累積合計を計算します。これは、式 prefix_sum[j 1] - prefix_sum[i].</li> を使用して、サブ配列 nums[i...j] の合計を計算するのに役立ちます。

</ul>

</li>

<li>

<p><strong>モノトニックキュー:</strong></p>

 

<ul>

<li>両端キューは、prefix_sum 配列のインデックスを値の昇順に保持します。この順序を維持することで、合計が k 以上である最小の部分配列を効率的に見つけることができます。</li>

</ul>

</li>

<li>

<p><strong>スライディング ウィンドウ ロジック:</strong></p>

 

<ul>

<li>prefix_sum 配列をたどるときに、現在の prefix_sum[i] と前の prefix_sum[deque[0]] の差を使用して最小の部分配列を見つけようとします。</li>

<li>差が k 以上の場合、部分配列の長さを計算し、見つかった最小の長さを更新します。</li>

</ul>

</li>

<li>

<p><strong>返される結果:</strong></p>

 

<ul>

<li>有効な部分配列が見つからない場合は、-1 を返します。それ以外の場合は、サブ配列の最小長を返します。</li>

</ul>

</li>

</ol>

 

<h3>

   

   

  時間計算量:

</h3>

 

<ul>

<li>

<strong>時間計算量:</strong> O(n)、n は入力配列の長さです。各要素は最大 2 回処理されます (両端キューに追加されるときに 1 回、削除されるときに 1 回)。</li>

<li>

<strong>空間の複雑さ:</strong> prefix_sum 配列とインデックスの格納に使用される両端キューにより O(n)。</li>

</ul>

 

<p>このアプローチにより、入力が大きい場合でもソリューションが効率的に実行されます。</p>

 

<p><strong>連絡先リンク</strong></p>

 

<p>このシリーズが役立つと思われた場合は、GitHub で <strong>リポジトリ</strong> にスターを付けるか、お気に入りのソーシャル ネットワークで投稿を共有することを検討してください。あなたのサポートは私にとって大きな意味を持ちます!</p>

 

<p>このような役立つコンテンツがさらに必要な場合は、お気軽にフォローしてください:</p>

 

<ul>

<li><strong>LinkedIn</strong></li>

<li><strong>GitHub</strong></li>

</ul>

 

 

           

 

             

   

 

             

         

 

<p>以上が。合計が少なくとも K である最短のサブ配列の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。</p>

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート