主題の要件
バージョン1:私の直感に基づいていますが残業
class Solution {
public:
int maxArea(vector<int>& height) {
unsigned MaxArea = 0, beforeHeight = 0, lowerHeight;
for (unsigned i = 0; i < height.size(); i++)
{
if (height.at(i) <= beforeHeight)
{
continue;
}
beforeHeight = height.at(i);
for (unsigned j = i+1; j < height.size(); j++)
{
lowerHeight = std::min(height.at(i), height.at(j));
MaxArea = std::max(lowerHeight * (j - i), MaxArea);
}
}
return MaxArea;
}
};
全体のアイデア
二重層のforループを使用してすべての状況をトラバースし、第1層のforループで剪定するための判断条件を追加します。すべての状況の中で最良のものを見つける
バージョン2:ダブルポインター方式(公式ソリューション)
class Solution {
public:
int maxArea(vector<int>& height) {
unsigned lp = 0, rp = height.size() - 1, maxArea = 0;
while (lp < rp)
{
maxArea = std::max(maxArea, std::min(height.at(lp), height.at(rp)) * (rp - lp));
height.at(lp) > height.at(rp) ? --rp : ++lp;
}
return maxArea;
}
};
全体のアイデア
最初に、2つのポインターを設定します。1つは配列の先頭を指し、もう1つは配列の末尾を指します。現在の最大面積を0に初期化します。
現在の2つのポインタの位置に基づいて新しい面積が計算され、現在の最大面積は次のように設定されます。
当前最大面积 = max(当前最大面积,新面积)
次に、2つのポインターを移動して、高さが小さいポインターを取得します。
- 左が右よりも高い場合は、右ポインタを1つ左に移動します
- 左が右より低い場合は、左のポインタを1つ右に移動します
新しい面積を再度計算し、現在の最大面積の値を変更してから、2つのポインターが一致するまで再度移動します。
学んだこと
1.初めてダブルポインタメソッドに触れたとき
2.三元式の記述に精通している:boolexp?exp1:exp2;