1. mixed array
  2. single element
  3. all same
  4. negative numbers
  5. ascending
  6. descending
コース一覧
コンピューターサイエンス入門:理論編
配列の最大と最小

コンピューターサイエンス入門:理論編

2 進数、論理演算、ビット演算、データ構造、計算量、メモリモデルなど、プログラミングの土台となるコンピュータサイエンスの理論知識を学べるコースです。プログラミングを始めたばかりの学習者や、CS の体系的な土台を作りたい現役エンジニアを対象としています。約 13 時間 (1 日 30 分 × 26 日) で 53 レッスンを修了でき、修了後はコードのパフォーマンスや設計判断の根拠を理解した上で実装できるようになります。

1
2進数とビット演算
01. 2進数から10進数への変換5分
02. 10進数から2進数への変換5分
03. ビットAND演算でフラグ判定5分
04. OR / XOR でフラグを操作する5分
05. popcount で 1 のビット数を数える5分
06. シフト演算で 2 倍 / 半分5分
07. 16 進数から 10 進数への変換5分
08. 第 1 章まとめクイズ5分
2
文字コードと真偽値ロジック
01. 文字 → ASCII コード5分
02. コード → 文字5分
03. UTF-8 のバイト長を返す5分
04. AND / OR の真理値表5分
05. NOT / XOR の真理値表5分
06. 含意 (→) を AND/OR/NOT で表現5分
07. ド・モルガンの法則5分
08. 第2章まとめクイズ5分
3
計算量とBig-O
01. forループの実行回数を返す5分
02. 入れ子ループの実行回数5分
03. 線形探索 (O(n))5分
04. 二分探索 (O(log n))5分
05. バブルソート5分
06. 配列の最大と最小5分
07. 累積和で範囲合計5分
08. 第3章まとめクイズ5分
4
データ構造 (基本)
01. スタック (push/pop) を実装する5分
02. キュー (enqueue / dequeue) を実装する5分
03. カッコのバランス判定 (スタック応用)5分
04. set で重複を除去する5分
05. map で出現回数を数える5分
06. 二数の和 (map で O(n))5分
07. アナグラム判定5分
08. 第 4 章クイズ — データ構造 (基本)5分
5
ファイル / メモリ / IO 概念
01. バイト → KB 変換5分
02. ディスクサイズフォーマット5分
03. キャッシュヒット率5分
04. LRU 簡易シミュレーション5分
05. エンディアンの入れ替え (uint32)5分
06. バッファ範囲チェック5分
07. 第5章まとめクイズ5分
6
ネットワークと符号化
01. Base64 エンコード後の長さ計算5分
02. URL エンコード対象文字数5分
03. IPv4 アドレスを 32bit 整数に変換5分
04. 32bit 整数を IPv4 アドレスに変換5分
05. CIDR プレフィックスからネットマスクを作る5分
06. 単純チェックサム5分
07. 第6章まとめクイズ5分
7
設計と DB 基礎
01. 重複データを 1NF に変換 (フラットなリスト化)5分
02. キーで join (map 利用)5分
03. 残高転送のトランザクション風処理5分
04. CAP の availability 模擬5分
05. URL ルーティング5分
06. 疎結合と密結合 — 依存性注入で設計を変える12分
07. コース総まとめクイズ5分

配列の最大と最小

2 周まわすのは、もったいない

気温の記録から「いちばん低かった日」と「いちばん高かった日」を出したいとします。素直に書けば、低いほうを探すために 1 周、高いほうを探すためにもう 1 周、合わせて 2 周です。答えは出ますが、同じデータを 2 回読んでいます。

読み込みが重いときや、値が次々と流れてくるときには、この 2 周目が取れません。1 周のあいだに 2 つを同時に追えれば、データに触るのは 1 回で済みます。

1 周のあいだに、2 つのことをやる

同時に追うというのは、難しい話ではありません。追いたいものの数だけ変数を用意して、ループの中でどちらも更新するだけです。合計と件数を同時に持って平均を出す例で見てみます。

Python

names = ["さとう", "たかはし", "あべ"] total = 0 count = 0 for n in names: total += len(n) count += 1 print(total / count) # 3.0

ループは 1 つ、更新する変数は 2 つ。片方が合計を、もう片方が件数を覚えています。低いほうと高いほうも、これと同じ形で並べられます。

候補を 1 つ持って、勝ったら差し替える

いちばん低い値やいちばん高い値は、「今のところの一番」を変数に持ち、より良いものが来たら差し替える、というやり方で求めます。形はこうです。

Python

best = "たかはし" challenger = "さとう" if len(challenger) > len(best): best = challenger print(best) # たかはし

気温 12, 19, 7, 15, 9 を左から見たとき、2 つの暫定値は次のように動きます。

見た値暫定の最低暫定の最高
121212
191219
7719
15719
9719

最初の 1 件では、最低も最高も同じ値です。あとは差し替えが起きるかどうかだけで、1 件につき比較は 2 回。全体でおよそ 2n 回、オーダーは O(n) です。覚えておく変数は 2 つだけなので、使うメモリは件数によらず一定、つまり O(1) です。

0 から始めると、答えがずれる

暫定値を 0 で始めるのは、よくある事故です。気温がすべて氷点より上の日ばかりなら、最低はいつまでも 0 のまま。逆にすべて氷点下なら、最高が 0 のまま。存在しない値を答えとして返してしまううえ、たまたま 0 をまたぐデータではテストが通ってしまうので、余計に厄介です。

暫定値は必ず 実際のデータの 1 件目 から始めてください。そうすれば、値がどんな範囲でも正しく動きます。

ただし、1 件目が取れない場合があります。

Python

temps = [] print(temps[0]) # IndexError: list index out of range

空のデータが来ないと決まっているなら、そのまま進めて構いません。決まっていないなら、本体に入る前に弾いておきます。

要件

  1. 1 回のループで最小値と最大値の両方を求めること
  2. 組み込みの min() / max() / Math.min / Math.max は使わない
  3. 戻り値は [min, max] の順の長さ 2 の配列

入出力例

minMax([3,1,4,1,5,9,2,6]) → [1,9] minMax([42]) → [42,42] minMax([7,7,7]) → [7,7] minMax([-5,-10,-3]) → [-10,-3] minMax([1,2,3,4,5]) → [1,5] minMax([5,4,3,2,1]) → [1,5]

ヒント

mn と mx を arr[0] で初期化し、i = 1 から len(arr)-1 まで比較する

if arr[i] < mn と if arr[i] > mx の 2 つの条件で更新する

戻り値の順番は [min, max] (最小が先) を間違えないこと

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 累積和で範囲合計

    累積和 (prefix sum) を作っておくことで、範囲合計のクエリを O(1) で答えられる仕組みを学ぶ。

  • 第3章まとめクイズ

    計算量と Big-O、線形探索・二分探索・累積和の理解度を 1 問のクイズで確認する。

  • スタック (push/pop) を実装する

    後入れ先出し (LIFO) の代表選手であるスタックを、push と pop の操作シーケンスで動かす。

  • バイト → KB 変換

    1024 で割って KB に変換し、容量表示の基本を体得する

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 変数データに名前をつけて参照する仕組み
  • ループ繰り返し処理。矢印で戻すか専用記号で示す
  • メモリプログラムとデータを一時保持する高速領域
  • テストバグを見つける工程
  • 戻り値呼び出し元への返答を表す点線矢印
  • 配列サイズ固定の同型データの集まり
main.py
学習モード
エディタを読み込んでいます

メモ

配列の最大と最小

⌘S で保存