最近,网上又一个帖子火了,是关于一个中厂总监的工资收入。
看完之后,我简直是又羡慕又感慨。
这位总监四年收入竟然高达196万,税后到手143万。
这数字放在哪儿都够耀眼的,但这背后的故事,又有几人能真正看见呢?
从62万起步,年薪涨到200万,这种速度和高度,真的不是常人能达到的。可 见,这位总监的努力和付出肯定是超乎常人的。就像那句老话,「十年寒窗无人问,一举成名天下知」。我们看到的是他现在的辉煌,却没看到他过去的艰辛。
这让我想到了那些梦想着高薪工作的人们。大家都好 奇,哪些行业能让人薪水翻倍,过上所谓的「高品质生活」?高薪往往出现在高科技、金融、医疗、法律等领域,这些行业对专业技能的要求极高,但同时给出的报酬也相对吸引人。
比如金融行业,那可是高薪的代名词。投资银行、风险管理,还有那些基金经理、证券分析师,听着就觉得不一般。
科技行业的吸金能力也是杠杠的。在这个数字化速度飞快的时代,软件开发、数据科学、人工智能这些领域的大佬们,薪水自然是水涨船高。
医疗行业同样不容小觑。医生、外科医生、牙医等专业人才,他们的工资单上的数字,也足够让人羡慕一把。
法律行业,哦,那更是「金」职业。律师事务所、法院的大佬们,每个月的收入,绝对是你我望尘莫及的。
要真正走向高薪的职业道路,除了个人能力和努力,运气也是很重要的。有时候,选对了行业,选对了公司,再加上一点点的机遇,可能就能让你的职业生涯一飞冲天!
下面是今天的算法题
# 三数之和
算法题目
给你一个包含 n 个整数的数组 `nums`,判断 `nums` 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
引言
三数之和问题是一个经典的数组处理问题,在算法面试中经常出现。它不仅测试了候选人对数组操作的熟练程度,还涉及到如何有效地处理重复值和寻找合适的算法策略以降低时间复杂度。
算法思路
排序:首先对数组进行排序,这是后续去重和优化搜索的基础。
遍历:遍历排序后的数组,对于每个元素,使用双指针在其之后的部分寻找两个数,使得这三个数的和为0。
双指针搜索:双指针一前一后夹逼,寻找两个数使得它们的和加上当前遍历到的数等于0。
去重:在遍历和双指针搜索过程中,需要跳过重复的元素,以避免重复的三元组出现。
代码实现
C语言实现
#include<stdio.h>
#include<stdlib.h>
intcompare(constvoid *a, constvoid *b){
return (*(int *)a - *(int *)b);
}
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
qsort(nums, numsSize, sizeof(int), compare);
*returnSize = 0;
int capacity = 100; // 初始化数组大小
int** res = (int**)malloc(capacity * sizeof(int*));
*returnColumnSizes = (int*)malloc(capacity * sizeof(int));
for (int i = 0; i < numsSize - 2; i++) {
if (i > 0 && nums[i] == nums[i-1]) continue; // 去重
int left = i + 1, right = numsSize - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
if (*returnSize >= capacity) { // 动态调整数组大小
capacity *= 2;
res = (int**)realloc(res, capacity * sizeof(int*));
*returnColumnSizes = (int*)realloc(*returnColumnSizes, capacity * sizeof(int));
}
res[*returnSize] = (int*)malloc(3 * sizeof(int));
res[*returnSize][0] = nums[i];
res[*returnSize][1] = nums[left];
res[*returnSize][2] = nums[right];
(*returnColumnSizes)[*returnSize] = 3;
(*returnSize)++;
while (left < right && nums[left] == nums[left+1]) left++; // 去重
while (left < right && nums[right] == nums[right-1]) right--; // 去重
left++; right--;
} elseif (sum < 0) {
left++;
} else {
right--;
}
}
}
return res;
}
Java实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public classSolution{
publicList<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<>();
for (int i = 0; i < nums.length - 2; i++) {
if (i > 0 && nums[i] == nums[i-1]) continue; // 去重
int left = i + 1, right = nums.length - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
res.add(Arrays.asList(nums[i], nums[left], nums[right]));
while (left < right && nums[left] == nums[left+1]) left++; // 去重
while (left < right && nums[right] == nums[right-1]) right--; // 去重
left++; right--;
} elseif (sum < 0) {
left++;
} else {
right--;
}
}
}
return res;
}
}
Python实现
defthree_sum(nums):
nums.sort()
res = []
for i in range(len(nums) - 2):
if i > 0and nums[i] == nums[i - 1]:
continue# Skip the same result
l, r = i + 1, len(nums) - 1
while l < r:
total = nums[i] + nums[l] + nums[r]
if total == 0:
res.append([nums[i], nums[l], nums[r]])
while l < r and nums[l] == nums[l + 1]:
l += 1# Skip the same result
while l < r and nums[r] == nums[r - 1]:
r -= 1# Skip the same result
l += 1; r -= 1
elif total < 0:
l += 1
else:
r -= 1
return res
算法解析
三数之和问题的核心在于如何有效地处理重复元素和如何利用排序后数组的性质来简化问题。排序使我们能够应用双指针技术,而去重则确保了我们找到的解是唯一的。
示例和测试
对于数组 `nums = [-1, 0, 1, 2, -1, -4]`,一个可能的解集是 `[[-1, -1, 2], [-1, 0, 1]]`。
总结
三数之和问题是一道经典的算法题目,它不仅要求我们掌握数组和双指针的操作,还要求我们学会如何去重和优化算法性能。
热门推荐