有重复项数字的所有排列&&滑动窗口的最大值&&二叉树中是否存在节点和为指定值的路径

122 阅读1分钟

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;
    }
}