【LeetCode】739. 每日温度

维护一个存储下标的单调栈

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int> stack;
int i=0;
int index=-1;
int n=temperatures.size();
vector<int> ans(n,0);
while(i<n){
while(index >= 0 &&temperatures[i]>temperatures[stack[index]]){
ans[stack[index]]=i-stack[index];
stack.pop_back();
index--;

}
stack.push_back(i);
index++;
i++;
}

return ans;
}
};

【LeetCode】142. 接雨水

方法一:动态规划

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
if (n == 0) {
return 0;
}
vector<int> leftMax(n);
leftMax[0] = height[0];
for (int i = 1; i < n; ++i) {
leftMax[i] = max(leftMax[i - 1], height[i]);
}

vector<int> rightMax(n);
rightMax[n - 1] = height[n - 1];
for (int i = n - 2; i >= 0; --i) {
rightMax[i] = max(rightMax[i + 1], height[i]);
}

int ans = 0;
for (int i = 0; i < n; ++i) {
ans += min(leftMax[i], rightMax[i]) - height[i];
}
return ans;
}
};

方法二:单调栈

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
int trap(vector<int>& height) {
int ans = 0;
stack<int> stk;
int n = height.size();
for (int i = 0; i < n; ++i) {
while (!stk.empty() && height[i] > height[stk.top()]) {
int top = stk.top();
stk.pop();
if (stk.empty()) {
break;
}
int left = stk.top();
int currWidth = i - left - 1;
int currHeight = min(height[left], height[i]) - height[top];
ans += currWidth * currHeight;
}
stk.push(i);
}
return ans;
}
};

方法三:双指针

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
int left = 0, right = n - 1;
int leftMax = 0, rightMax = 0;
int ans = 0;

while (left < right) {
if (height[left] <= height[right]) {
if (height[left] > leftMax) {
leftMax = height[left];
}
else {
ans += leftMax - height[left];
}
left++;
}
else {
if (height[right] > rightMax) {
rightMax = height[right];
}
else {
ans += rightMax - height[right];
}
right--;
}
}

return ans;
}
};

【LeetCode】135. 分发糖果

左右各遍历一次,每个人最终分得的糖果数量即为这两个数量的最大值。

省内存与时间的技巧:计算出左规则 left 数组,在计算右规则的时候只需要用单个变量记录当前位置的右规则,同时计算答案即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
int candy(vector<int>& ratings) {
int n = ratings.size();
vector<int> left(n);
for (int i = 0; i < n; i++) {
if (i > 0 && ratings[i] > ratings[i - 1]) {
left[i] = left[i - 1] + 1;
} else {
left[i] = 1;
}
}
int right = 0, ret = 0;
for (int i = n - 1; i >= 0; i--) {
if (i < n - 1 && ratings[i] > ratings[i + 1]) {
right++;
} else {
right = 1;
}
ret += max(left[i], right);
}
return ret;
}
};

【LeetCode】134. 加油站

从头到尾遍历每个加油站,并检查以该加油站为起点,最终能否行驶一周。

但在一些特殊输入时会超出时间限制,原因在于起点不应逐个遍历,而要跳至第一个无法到达的加油站开始继续检查,可以将时间复杂度从O(n^2)降至O(n)。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size();
int i = 0;
while (i < n) {
int sumOfGas = 0, sumOfCost = 0;
int cnt = 0;
while (cnt < n) {
int j = (i + cnt) % n;
sumOfGas += gas[j];
sumOfCost += cost[j];
if (sumOfCost > sumOfGas) {
break;
}
cnt++;
}
if (cnt == n) {
return i;
} else {
i = i + cnt + 1;
}
}
return -1;
}
};

【LeetCode】380. O(1)时间插入、删除和获取随机元素

哈希+变长数组

变长数组可以在O(1)的时间内完成获取随机元素操作,但是由于无法在O(1)的时间内判断元素是否存在,因此不能在O(1)时间内完成插入和删除操作。哈希表可以在O(1)的时间内完成插入和删除操作,但是由于无法根据下标定位到特定元素,因此不能在O(1)的时间内完成获取随机元素操作。为了满足插入、删除和获取随机元素操作的时间复杂度都是 O(1),需要将变长数组和哈希表结合,变长数组中存储元素,哈希表中存储每个元素在变长数组中的下标。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
sdclass RandomizedSet {
public:
RandomizedSet() {
srand((unsigned)time(NULL));
}

bool insert(int val) {
if (indices.count(val)) {
return false;
}
int index = nums.size();
nums.emplace_back(val);
indices[val] = index;
return true;
}

bool remove(int val) {
if (!indices.count(val)) {
return false;
}
int index = indices[val];
int last = nums.back();
nums[index] = last;
indices[last] = index;
nums.pop_back();
indices.erase(val);
return true;
}

int getRandom() {
int randomIndex = rand()%nums.size();
return nums[randomIndex];
}
private:
vector<int> nums;
unordered_map<int, int> indices;
};

【摘要】金学

(暴论仅供参考,不代表本站立场)

当下年轻人面临的困境

财富增量时代全面结束,同时随着信息不对称全面消失,各行业的利润都会走向稀薄

东亚家庭教育阻止了人的社会化

长期以来我们的社会都在鼓吹弱者教育,具体有两个极端,要么是鸡娃教育,要么是放养式教育。这样教出来的孩子成不了豺狼虎豹,要么是温顺的绵羊,要么是蛇虫鼠蚁。这样的教育让孩子严重缺乏street smart,最多只有一些并不高级的book smart。

而这不仅源自于家长的无知,还在于他们的控制欲和私心,毕竟孩子朝着凶猛的掠食者发展,首先感到不安定的就是这些家长。没错,很多父母是在拼命打压子女变成猛兽的可能性。

然而社会丛林的毒蛇猛兽可不会惯着绵羊们,毕竟爹妈再强大不可能能护着孩子一辈子。如果不想让孩子陷入脆弱,家长应该改变思维和认知。让孩子尽早参与了解和实践这个真实社会丛林的面貌,避免长期脱产把孩子弄废了,这是反脆弱的最好做法。

主流教育培养弱者特质,污名化强者特质。

强者特质:

  • 现实主义
  • 执行力强、刚毅勇敢
  • 专注现实价值
  • 拥抱变化、追求不断挑战
  • 擅长维护人脉、交易思维
  • 客观灰度的看待事物
  • 推崇社会化市场化、追求多元维度竞争
  • 反抗传统,拥抱变化
  • 终身学习(非做题)

弱者特质:

  • 幼稚(不等于理想主义)
  • 执行力弱、胆小怕事
  • 相信大而虚的概念
  • 贪图稳定、追求一劳永逸
  • 白嫖他人价值、贪小便宜
  • 二元非黑即白地看待事物
  • 推崇做题考试,排斥多元维度竞争
  • 盲从传统,抗拒改变
  • 懒于学习、懒于提升认知

关于成熟

做好自己能控制的一切事情。

认清、接纳、适应自己所不能控制的一切事情。

关于学历

学历这年头除了能垄断校友圈和文凭什么都说明不了,这些东西都需要你自己有足够大的社会化价值才能用得上。

现在和未来,能混出头的和做题没有半毛钱关系,尽快打磨和极致化自己的社会化价值才是唯一出路。

关于专业

无论什么科都有用武之地,重要的是多大程度贴近产业和市场上的机会,不仅要看当下也要看未来,尽早社会化才是关键。

更重要的是自己的性格和追求,喜不喜欢和适合与否,这极端重要,不是真心适合喜欢的是无法长久下去的。

关于体制内

本身东亚文化圈就已经非常囚笼了,体制内特别行政机关是囚笼中的囚笼。

在社会丛林中自由讨食的野生动物,和长期生活在深度囚笼中被严格驯养的动物一定是不一样的。

虽然前者分化极大,但普遍在自身的生态位中不用接受那么严格的约束,还能相对自由的展现本性。

后者则必须接受严格约束,时间久了没有其他可能性了就安于舒适区,不仅不向往体制外,还会抵触体制外的很多自己不熟悉的东西。

容易磨灭个性,失去自由,图稳求安,心气败落,畏畏缩缩,谨小慎微,思维守旧,跟不上变化,瞻前顾后,行事被动。

这一切都是人步入衰老和下沉的整体气质特征,象征着生命力流失+活力的丧失+内核吸引力的折损。

关系 or 资源

现在事比资源强,牛逼的事和模式,牛逼的核心生产资料贡献能力,极致垂直化的竞争力,才是稀缺东西。

只有先把握住这些,做好自己能做好的,资本和资源会源源不断的被吸引过来甚至追着跑着要勾兑。

阶级滑落成为必然

现在不仅是一个人走茶凉的时代,人还没走茶就已经凉了也是常态,60后70初的颓势正在不断显现。社会资源大缩水大打折的时代全面降临,未来十年随着60后70后全面退出历史舞台,会有一大批传统二代尤其是体制内一定层级以上的被彻底钉死在中产到小康不等。

  • Copyrights © 2019-2024 Hxy
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信