最近,一位大厂HR的爆料他们最近面试了一大波年纪超40的求职者。你们猜怎么着?
这帮人之前在大厂拿的年薪都是80W+,现在竟然只求个月薪1W就好。
你没听错,从年薪80万到月薪一万,这转变得有多大你们感受一下。
这事儿让我不禁想起那句老话,「黄金屋,颜如玉」,在这职场中,尤其是那些知名大厂,竞争激烈得就像是丛林法则一样。
这些原本年薪80万的大佬们,现在为何甘愿接受月薪一万的职位呢?
背后的原因多半是职场中的年龄歧视,还有让人头疼的中年危机。在这个更新换代极快的时代,技术人员尤其要面临新技术的挑战,一旦跟不上节奏,很容易就被市场淘汰。
所以,这件事给我们的警示是什么呢?我觉得,首先是作为职场人的我们,要不断学习,更新自己的知识库,保持竞争力。另一方面,也希望社会能够给予我们这些年纪稍大的职场人更多的理解和支持,不要只看年龄,也看看我们的能力和经验。
下面是今日算法题
今日算法题,来自LeetCode的第11题:盛最多水的容器,下面是我的算法思路及实现,让我们来看看吧。
# 算法题目
给定一个长度为 n 的非负整数数组 height,其中每个元素代表一个点(i, height[i])在坐标系中的位置。找出两条线,它们与 x 轴共同构成一个容器,使得容器可以容纳最多的水。
注意:你不能倾斜容器。
# 算法思路
初始化两个指针:一个在数组的开始,另一个在数组的末尾。
计算当前指针对应的容量:容量计算公式为 min(height[left], height[right]) * (right - left)。
移动指针:为了尝试找到更大的容量,我们将移动两个指针中指向较短线段的那一个(因为容器的容量受限于较短的边)。如果左边的线段较短,则左指针向右移动;如果右边的线段较短,则右指针向左移动。
重复步骤2和3,直到两个指针相遇。
在整个过程中保留最大的容量,这将是我们的最终答案。
# 代码实现
C语言实现
#include<stdio.h>
intmaxArea(int* height, int heightSize){
int max_area = 0, left = 0, right = heightSize - 1;
while (left < right) {
int width = right - left;
int h = height[left] < height[right] ? height[left++] : height[right--];
int area = width * h;
if (area > max_area) {
max_area = area;
}
}
return max_area;
}
Java实现
public classSolution{
public int maxArea(int[] height) {
int maxArea = 0, left = 0, right = height.length - 1;
while (left < right) {
int area = Math.min(height[left], height[right]) * (right - left);
maxArea = Math.max(maxArea, area);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxArea;
}
}
Python实现
def max_area(height):
max_area, left, right = 0, 0, len(height) - 1
whileleft < right:
width = right - left
h = min(height[left], height[right])
max_area = max(max_area, width * h)
if height[left] < height[right]:
left += 1
else:
right -= 1
return max_area
# 算法解析
本问题的关键在于理解如何通过移动较短的线段来增加找到更大容量的机会。这种方法保证了我们能够在 O(n) 的时间复杂度内检查每一种可能性,同时避免了不必要的重复计算。
# 示例和测试
假设我们有高度数组 height = [1,8,6,2,5,4,8,3,7],按照我们的算法,最大容量为 49。
测试代码(Python)
height = [1,8,6,2,5,4,8,3,7]
print("最大容量:", max_area(height))
# 总结
「盛最多水的容器」问题通过双指针法可以高效解决。这种方法减少了不必要的计算,从而达到了线性时间复杂度,是解决这类问题的一个非常好的范例。
热门推荐