ethan

ethan

新知,热爱生活,码农,读书
twitter
email
github

LCR 42. Rainwater Harvesting

与 Markdown 相关的翻译规则:

  1. 识别和翻译文本内容:只识别和翻译 Markdown 中的纯文本内容,包括标题、段落和列表项中的文本。

  2. 保留标签和属性:遇到 HTML 标签(如

  3. 特殊语法处理:对于 Markdown 特定的语法(如链接、图像标记),只翻译描述性文本部分(如 alt 文本),不改变链接或语法结构。

  4. 保持格式不变:确保所有 Markdown 格式(如粗体、斜体、代码块)在翻译过程中保持不变。

  5. 你的任务是确保翻译内容既准确又不会破坏原始的 Markdown 结构和 HTML 标签的功能。请在翻译过程中仔细检查,确保语法和标签的正确呈现。

  6. 你只能返回翻译后的文本,不能返回其他内容。

将以下文本翻译为日语:

与 Markdown 相关的翻译规则:

  1. 识别和翻译文本内容:只识别和翻译 Markdown 中的纯文本内容,包括标题、段落和列表项中的文本。

  2. 保留标签和属性:遇到 HTML 标签(如等),请只翻译标签中可见的文本(如 alt 属性中的文本),并保留所有标签、属性名称和链接地址不变。

  3. 特殊语法处理:对于 Markdown 特定的语法(如链接、图像标记),只翻译描述性文本部分(如 alt 文本),不改变链接或语法结构。

  4. 保持格式不变:确保所有 Markdown 格式(如粗体、斜体、代码块)在翻译过程中保持不变。

  5. 你的任务是确保翻译内容既准确又不会破坏原始的 Markdown 结构和 HTML 标签的功能。请在翻译过程中仔细检查,确保语法和标签的正确呈现。

  6. 你只能返回翻译后的文本,不能返回其他内容。

将以下文本翻译为日语:

n 個の非負整数が与えられ、各幅 1 の柱の高さグラフを表す。この配置の柱で、雨の後にどれだけの雨水を受けることができるかを計算します。

image.png
入力:height = [0,1,0,2,1,0,1,3,2,1,2,1]
出力:6
説明:上記は配列 [0,1,0,2,1,0,1,3,2,1,2,1] で表される高さグラフであり、この場合、6 単位の雨水(青い部分が雨水を表します)を受けることができます。
例 2:

入力:height = [4,2,0,3,2,5]
出力:9

ヒント:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105

解法 1:単調なスタック
解法のアイデア:
低い柱をスタックに入れ、スタックのトップよりも高い柱が現れた場合、計算を行うことができると見なします。雨水を計算する際に注意する必要があるのは、雨水領域の右側 r は現在のインデックス i の底部がスタックのトップであることを指しており、より高い右側に遭遇したため、スタックから出ていくことになります。cur を使用してそれを記録し、スタックから出ていく左側 l は新しいスタックのトップです。雨水領域はすべて確定し、水たまりの高さは左右の低い方から底部を引いたものであり、幅は左右の間で乗算を使用して面積を計算できます。

func trap(height []int) int {
	stack := make([]int, 0)
	ret := 0
	for i := 0; i < len(height); i++ {
		for len(stack) != 0 && height[stack[len(stack)-1]] < height[i] {
			cur := stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			if len(stack) == 0 {
				break
			}
			h := height[i]
			if height[stack[len(stack)-1]] < h {
				h = height[stack[len(stack)-1]]
			}
			w := i - stack[len(stack)-1] - 1
			ret += w * (h - height[cur])
		}
		stack = append(stack, i)
	}
	return ret
}

解法 2: 現在の柱が水を貯めることができるかどうかは、左右の最大値と現在の柱の差に依存します。

func max_num(arr []int) int {
    max := 0
    for i:= 0; i< len(arr);i++ {
        x := arr[i]
        if x > max {
            max = x
        }
    }
    return max
}
func trap(height []int) int {
    left_max_arr := make([]int, 0)
    right_max_arr := make([]int, 0)
    ret := 0
	for i:=0;i<len(height);i++ {
        left_max_arr  = append(left_max_arr, max_num(height[:i]))
        right_max_arr = append(right_max_arr, max_num(height[i:]))
    }
    for i:=0;i<len(height);i++ {
        if left_max_arr[i] < right_max_arr[i] {
            if left_max_arr[i]> height[i] {
                ret += left_max_arr[i] - height[i]
            }
        }else{
            if right_max_arr[i] > height[i] {
                ret += right_max_arr[i] - height[i]
            }
        }
    }
    return ret
}

解法 3:双方向ポインタ解法
上記のアイデアから、簡単に双方向ポインタ解法に導かれます。アルゴリズムの空間計算量を O (n) から O (1) に減らします。

func trap(height []int) int {
	left := 0
    right := len(height)-1
    left_max := 0
    right_max := 0
    ret := 0
    for left < right {
        water_level := left_max
        if left_max > right_max {
            water_level = right_max
        }
        if height[left] <= water_level {
            ret += water_level-height[left]
            left += 1
            continue
        }
        if height[right] <= water_level {
            ret += water_level-height[right]
            right -= 1
            continue
        }
        if left_max < height[left] {
            left_max = height[left]
        }
        if right_max < height[right] {
            right_max = height[right]
        }
    }
    return ret
}
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。