NC42 有重复项数字的所有排列
1、解题思路
首先对数组进行排序,排序之后,在dfs的时候
if (i != 0 && nums[i] == nums[i - 1] && vis[i - 1] == 0) { continue; }这个代码的意思是让相同的元素,位置靠后的后出现。
##### 2、代码
import java.util.*;
public class Solution {
private void dfs(int[] vis, int[] nums, ArrayList<Integer> list, ArrayList<ArrayList<Integer>> lists) {
if (list.size() == nums.length) {
lists.add(new ArrayList<>(list));
} else {
for (int i = 0; i < nums.length; i++) {
if (i != 0 && nums[i] == nums[i - 1] && vis[i - 1] == 0) {
continue;
}
if (vis[i] == 1) {
continue;
}
list.add(nums[i]);
vis[i] = 1;
dfs(vis, nums, list, lists);
vis[i] = 0;
list.remove(list.size() - 1);
}
}
}
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
Arrays.sort(num);
ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
int[] vis = new int[num.length];
ArrayList<Integer> arrayList = new ArrayList<>();
dfs(vis, num, arrayList, lists);
return lists;
}
}
NC82 滑动窗口的最大值
1、解题思路
使用双端队列,保证队列的元素递减,队首元素就是当前窗口的最大值。当遇到更大的值是把小的值从队列屁股弹出去,每次窗口淘汰出去的值需要和队首元素比较,如果相等,从队首移除元素。
2、代码
import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size) {
ArrayList<Integer> arrayList = new ArrayList<>();
if (size > num.length || size == 0) {
return arrayList;
}
Deque<Integer> queue = new ArrayDeque<>();
for (int i = 0; i < size; i++) {
if (queue.isEmpty()) {
queue.addLast(num[i]);
continue;
}
// 保证递减就好了
while (!queue.isEmpty() && queue.peekLast() < num[i]) {
queue.removeLast();
}
queue.addLast(num[i]);
}
arrayList.add(queue.peekFirst());
for (int i = size; i < num.length; i++) {
int val = num[i - size];
if (queue.peek() == val) {
queue.removeFirst();
}
while (!queue.isEmpty() && queue.peekLast() < num[i]) {
queue.removeLast();
}
queue.addLast(num[i]);
arrayList.add(queue.peekFirst());
}
return arrayList;
}
}
NC9 二叉树中是否存在节点和为指定值的路径
1、解题思路
递归求解
2、代码
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @param sum int整型
* @return bool布尔型
*/
public boolean hasPathSum (TreeNode root, int sum) {
if (root == null) {
return false;
}
if (root.val == sum && root.left == null && root.right == null) {
return true;
}
if (root.left != null) {
boolean f = hasPathSum(root.left, sum - root.val);
if (f) {
return true;
}
}
if (root.right != null) {
boolean b = hasPathSum(root.right, sum - root.val);
if (b) {
return true;
}
}
return false;
}
}