第65题 Container With Most Water

针对给定的高度数组,本文详细阐述了如何通过双指针法高效地找出两个垂直线所形成的容器能容纳最多水的方法。文章以具体示例[4,6,2,6,7,11,2]为引导,深入浅出地解释了算法原理,并提供了C++实现代码。

Given n non-negative integers a1a2, ..., an, where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container.

Hide Tags
  Array Two Pointers








Solution in C++:
class Solution {
public:
    int maxArea(vector<int>& height) {
        int left=0, right = height.size()-1;
        int area =0;
        while(left<right){
            area = max(area, min(height[left], height[right])*(right-left));
            height[left]<height[right]? left++: right--;
        }
        return area;
    }
};
Note: 从两边往中间找,原因如下:

题目意思就不翻译了,大概是要找到条纵线然后这两条线以及X轴构成的容器能容纳最多的水。

下面以例子:   [4,6,2,6,7,11,2] 来讲解。

1.首先假设我们找到能取最大容积的纵线为 i , j (假定i<j),那么得到的最大容积 C = min( ai , aj ) * ( j- i) ;

2.下面我们看这么一条性质:

①: 在 j 的右端没有一条线会比它高! 假设存在 k |( j<k && ak > aj) ,那么  由 ak> aj,所以 min( ai,aj, ak) =min(ai,aj) ,所以由i, k构成的容器的容积C' = min(ai,aj ) * ( k-i) > C,与C是最值矛盾,所以得证j的后边不会有比它还高的线;

②:同理,在i的左边也不会有比它高的线;

这说明什么呢?如果我们目前得到的候选: 设为 x, y两条线(x< y),那么能够得到比它更大容积的新的两条边必然在  [x,y]区间内并且 ax' > =ax , ay'>= ay;

3.所以我们从两头向中间靠拢,同时更新候选值;在收缩区间的时候优先从  x, y中较小的边开始收缩;

 

直观的解释是:容积即面积,它受长和高的影响,当长度减小时候,高必须增长才有可能提升面积,所以我们从长度最长时开始递减,然后寻找更高的线来更新候补;

reference from http://blog.youkuaiyun.com/a83610312/article/details/8548519

### Kubernetes 容器退出代码 255 的解决方案 在 Kubernetes 中,容器退出代码为 `255` 通常表示容器运行时发生了一些未捕获的错误或异常。以下是一些可能的原因和解决方法: #### 1. **镜像拉取失败** 如果容器无法正确拉取镜像,则可能会导致退出代码为 `255`。可以通过检查镜像是否正确存在以及是否有权限访问该镜像来排查问[^3]。 ```bash kubectl rollout status deployment <deployment-name> ``` 上述命令可以用于检查镜像是否成功被拉取到集群中。如果镜像拉取失败,需要确保提供的镜像路径正确,并且节点有权限访问该镜像仓库。 #### 2. **命令或入口点配置错误** 容器启动时执行的命令或入口点配置错误也可能导致退出代码 `255`。例如,在 YAML 文件中定义的 `command` 或 `args` 参数不正确[^2]。 ```yaml apiVersion: batch/v1 kind: Job metadata: name: myapp spec: template: spec: containers: - name: main-container-1 image: busybox:1.35 command: ["sh", "-c"] args: - | echo "main container is starting..." for i in $(seq 1 5); do echo "main container is doing some task: $i/5" sleep 3 done echo "main container completed tasks and exited" restartPolicy: OnFailure ``` 上述示例展示了如何正确配置 `command` 和 `args`。如果容器内的命令执行失败(如命令不存在或语法错误),则会导致退出代码为 `255`。可以通过检查日志来确认具体原因: ```bash kubectl logs <pod-name> -c <container-name> ``` #### 3. **资源限制** 如果容器的 CPU 或内存资源超出限制,Kubernetes 可能会终止容器并返回退出代码 `255`。可以通过以下命令检查容器的资源使用情况: ```bash kubectl describe pod <pod-name> ``` 在描述信息中查找 `OOMKilled` 或其他与资源相关的警告。如果发现资源不足,可以调整容器的资源限制: ```yaml resources: limits: memory: "128Mi" cpu: "500m" requests: memory: "64Mi" cpu: "250m" ``` #### 4. **应用程序内部错误** 容器中的应用程序可能由于内部错误而崩溃,从而返回退出代码 `255`。这需要检查应用程序的日志以定位问。例如,如果应用程序依赖于外部服务(如数据库或消息队列),而这些服务不可用,则可能导致程序崩溃。 #### 5. **初始化容器失败** 如果 Pod 中包含初始化容器(Init Container),并且初始化容器未能成功完成其任务,则主容器可能不会启动,并返回退出代码 `255`。可以通过以下命令检查初始化容器的状态: ```bash kubectl get pods <pod-name> -o yaml ``` 在输出中查找 `initContainers` 部分,确认其状态是否为 `Succeeded`。 --- ### 示例代码:检查容器退出原因 以下是一个简单的脚本,用于自动检查容器的退出代码并获取日志: ```python import subprocess def check_container_exit_code(pod_name, container_name): try: # 获取容器的退出代码 exit_code_command = f"kubectl get pod {pod_name} -o jsonpath='{{.status.containerStatuses[?(@.name==\"{container_name}\")].state.terminated.exitCode}}'" exit_code = subprocess.check_output(exit_code_command, shell=True).decode('utf-8').strip() # 如果退出代码为 255,则获取日志 if exit_code == "255": log_command = f"kubectl logs {pod_name} -c {container_name}" logs = subprocess.check_output(log_command, shell=True).decode('utf-8') return f"Container exited with code 255. Logs:\n{logs}" else: return f"Container exited with code {exit_code}." except Exception as e: return f"Error: {str(e)}" # 示例调用 result = check_container_exit_code("my-pod", "my-container") print(result) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值