?题外话
昨天有小伙伴找我,问有很多题不会怎么办?了解完之后发现是数据结构这块还不太了解,很多知识不知道怎么建链表和栈都不太了解。我建议还是从数据结构看看把这块补上来我们再慢慢来刷题,至于怎么补如果小伙伴没有好的计划也可以来私聊我,我给大家找找资源。
🌟算法题
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
示例 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
🌟一点点思路
跟着我做题的小伙伴可能会发现了,今天的题只是昨天题的加强版。不熟悉思路的大佬可以看看肥肥 的上一篇,这次我们依旧采用上次的方法。
🌟源码和详解
本题和昨天的相比最主要的就是解决重复的问题保证在填第 \textit{idx}idx 个数的时候重复数字只会被填入一次即可。大家可以参照昨天的文章来看看。
class Solution {
boolean[] arr;
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
List<Integer> perm = new ArrayList<Integer>();
arr = new boolean[nums.length];
Arrays.sort(nums);
backtrack(nums, ans, 0, perm);
return ans;
}
public void backtrack(int[] nums, List<List<Integer>> ans, int idx, List<Integer> perm) {
if (idx == nums.length) {
ans.add(new ArrayList<Integer>(perm));
return;
}
for (int i = 0; i < nums.length; ++i) {
if (arr[i] || (i > 0 && nums[i] == nums[i - 1] && !arr[i - 1])) {
continue;
}
perm.add(nums[i]);
arr[i] = true;
backtrack(nums, ans, idx + 1, perm);
arr[i] = false;
perm.remove(idx);
}
}
}
🌟面试题
MySQL中drop,delete与truncate的区别
相同点:
truncate和不带where子句的delete,以及drop都会删除表内的数据
不同点:
truncate会清除表数据并重置id从1开始,delete就只删除记录,drop可以用来删除表或数据库并且将表所占用的空间全部释放 truncate和delete只删除数据不删除表的结构。drop语句将删除表的结构被依赖的约(constrain),触发器(trigger),依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。 速度上一般来说: drop> truncate > delete 使用上,想删除部分数据行用 delete,想删除表用 drop,想保留表而将所有数据删除,如果和事务无关,用truncate即可。如果和事务有关,或者想触发trigger,还是用delete。 delete是DML语句,不会自动提交。drop/truncate都是DDL语句,执行后会自动提交。
资料获取
|