与 Markdown 相关的翻译规则:
-
识别和翻译文本内容:只识别和翻译 Markdown 中的纯文本内容,包括标题、段落和列表项中的文本。
-
保留标签和属性:遇到 HTML 标签(如、
-
特殊语法处理:对于 Markdown 特定的语法(如链接、图像标记),只翻译描述性文本部分(如 alt 文本),不改变链接或语法结构。
-
保持格式不变:确保所有 Markdown 格式(如粗体、斜体、代码块)在翻译过程中保持不变。
-
你的任务是确保翻译内容既准确又不会破坏原始的 Markdown 结构和 HTML 标签的功能。请在翻译过程中仔细检查,确保语法和标签的正确呈现。
-
你只能返回翻译后的文本,不能返回其他内容。
将以下文本翻译为日语:
与 Markdown 相关的翻译规则:
-
识别和翻译文本内容:只识别和翻译 Markdown 中的纯文本内容,包括标题、段落和列表项中的文本。
-
保留标签和属性:遇到 HTML 标签(如、等),请只翻译标签中可见的文本(如 alt 属性中的文本),并保留所有标签、属性名称和链接地址不变。
-
特殊语法处理:对于 Markdown 特定的语法(如链接、图像标记),只翻译描述性文本部分(如 alt 文本),不改变链接或语法结构。
-
保持格式不变:确保所有 Markdown 格式(如粗体、斜体、代码块)在翻译过程中保持不变。
-
你的任务是确保翻译内容既准确又不会破坏原始的 Markdown 结构和 HTML 标签的功能。请在翻译过程中仔细检查,确保语法和标签的正确呈现。
-
你只能返回翻译后的文本,不能返回其他内容。
将以下文本翻译为日语:
n 個の非負整数が与えられ、各幅 1 の柱の高さグラフを表す。この配置の柱で、雨の後にどれだけの雨水を受けることができるかを計算します。
入力: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
}