月薪从1.5万降到3千,我接受了。。。
我们一直说今年行情差,不好找工作,但能有多差,是比较模糊的。而我在网上看到一网友的帖子算是给了我一个概念,“有谁会接受月薪从1.5万降到三千吗?我接受了。”15k到3k?我都怀疑我看错了。但这还不是个例,更恐怖的也有。
贴子下有网友跟帖:“我也接受了,从17k跌到了3k”“我从4.5万降低到1.8万没人要”
还有网友也是不可置信:“送外卖收入也不止3000吧。”我只能说现在外卖也不是想送就送。
还有人乐天派:“兄弟,我接受了你的接受。”孩子,这并不好笑。
而更有网友表示:“我失业保险都有5000一个月。”好家伙,比很多人工资都高。
看完这些评论,大部分网友都不敢相信,认为楼主是不是考上了公务员什么的,楼主说不是,也没说什么原因。但是听听就好恐怖,15k到3k啊。
虽然只是个例,但管中窥豹,这搁以前,肯定都以为在开玩笑。就算到了现在,都觉得不可思议。那么大家怎么看呢?
今年的环境就这样,不管是大厂还是小厂,笔面试都会问算法,所以要内卷,算法是必不可少的。这是今日算法题,来自LeetCode的第46题:全排列,很多大厂都考过,下面是我的算法思路及实现,让我们来看看吧。
全排列
算法题目
给定一个不含重复数字的数组 nums,返回其所有可能的全排列。你可以按任意顺序返回答案。
引言
算法思路
解决全排列问题的关键是理解递归的过程及如何通过回溯遍历所有可能的排列。基本步骤如下:
路径:记录在 path 中,表示当前的排列情况。
选择列表:nums 中不存在于 path 的那些元素。
结束条件:nums 中的元素全都在 path 中出现。
算法过程:
从左至右遍历数组 nums,将当前元素加入到路径 path 中,并将其从选择列表中移除。
进入下一层决策树。
通过递归完成所有路径的探索。
回溯阶段:将当前元素从路径 path 中移除,恢复选择列表,继续探索其他路径。
代码实现
JavaScript实现
function permute(nums) {let res = [];let path = [];function backtrack(path) {if (path.length === nums.length) {res.push(Array.from(path));return;}for (let i = 0; i < nums.length; i++) {if (path.includes(nums[i])) continue;path.push(nums[i]);backtrack(path);path.pop();}}backtrack(path);return res;}
import java.util.ArrayList;import java.util.List;public class Solution {public List<List<Integer>> permute(int[] nums) {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();boolean[] used = new boolean[nums.length];backtrack(nums, used, path, res);return res;}private void backtrack(int[] nums, boolean[] used, List<Integer> path, List<List<Integer>> res) {if (path.size() == nums.length) {res.add(new ArrayList<>(path));return;}for (int i = 0; i < nums.length; i++) {if (used[i]) continue;path.add(nums[i]);used[i] = true;backtrack(nums, used, path, res);used[i] = false;path.remove(path.size() - 1);}}}
package mainfunc permute(nums []int) [][]int {var res [][]intvar path []intused := make([]bool, len(nums))var backtrack func(int)backtrack = func(n int) {if n == len(nums) {res = append(res, append([]int(nil), path...))return}for i, v := range nums {if used[i] {continue}path = append(path, v)used[i] = truebacktrack(n + 1)path = path[:len(path)-1]used[i] = false}}backtrack(0)return res}
算法解析
此算法的时间复杂度为O(n×n!),这是因为对于 n 个不同元素,每个元素都有 n-1 种排列方式,因此总的时间复杂度为排列数乘以生成每个排列的时间(即n!)。空间复杂度主要由递归深度O(n))和存储结果的列表(O(n!))决定。
示例和测试
以 nums = [1,2,3] 为例,按照上述算法步骤执行,可以得到结果 [[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]。
测试代码可以根据上述实现直接运行,以验证算法的正确性。
总结
扫描下方二维码,购买《AIGC商业变现课程》 送ChatGPT独享账号!
课程包含超多AI前沿玩法,帮助大家熟练掌握AI!