「鞍點」源於馬鞍形狀:沿脊線方向最低(行極小),垂直方向最高(列極大)。在矩陣中定義為:**某行最大、某列最小**的元素。本文給出標準查找算法、代碼實現與數學直覺解析。
對矩陣 a[m][n],若存在元素 a[i][j] 滿足:
a[i][j] = max(row i) (第 i 行最大)a[i][j] = min(col j) (第 j 列最小)則稱 a[i][j] 為鞍點。一個矩陣可能有 0 個、1 個或多個鞍點。
#includeint main() { int a[3][3] = {{16, 2, 3}, {14, 5, 6}, {7, 8, 9}}; int i, j, k, row_max_col, found = 0; int max_val; for (i = 0; i < 3; i++) { // 1. 找第 i 行最大值及其列 max_val = a[i][0]; row_max_col = 0; for (j = 1; j < 3; j++) { if (a[i][j] > max_val) { max_val = a[i][j]; row_max_col = j; } } // 2. 檢查該元素是否為第 row_max_col 列最小 int is_min = 1; for (k = 0; k < 3; k++) { if (a[k][row_max_col] < max_val) { is_min = 0; break; } } if (is_min) { printf("鞍點值: %d, 位置: [%d][%d]\n", max_val, i, row_max_col); found = 1; } } if (!found) printf("矩陣中無鞍點\n"); return 0; }
對矩陣:
16 2 3 14 5 6 7 8 9
修改矩陣為 {{1,2,3},{4,5,6},{7,8,9}},則 7 是第 2 行最大、第 0 列最小 → **鞍點為 7**。
O(m * n) 兩遍掃描,已是理論下界(必須讀完所有元素)O(1) 額外空間O(1),適合多次查詢場景鞍點問題是「行列極值交互」的經典縮影,掌握其雙重掃描邏輯,對解決矩陣極值、博弈均衡、圖論割點等問題極有啟發。