CodeTop一刷

算法 CodeTop 本文将深入探讨 CodeTop 中的一些经典问题,并提供多种实现方法及其应用场景,旨在帮助读者深入理解算法的本质。这种方法的时间复杂度为 O(n),空间复杂度为 O(1)。这种方法的时间复杂度为 O(n),空间复杂度为 O(n)。希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。暴力法是最直观的方法,通过遍历数组,将不重复的元素复制到一个新的数组中。这种方法的时间复杂度为 O(n),空间复杂度为 O(n)。,为我们广大开发同胞谋福祉, 阅读详情

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言


一、力扣56. 合并区间

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
        if(intervals.length == 1){
            return intervals;
        }
        List<int[]> res = new ArrayList<>();
        for(int i = 1; i < intervals.length; i ++){
            if(intervals[i][0] <= intervals[i-1][1]){
                intervals[i][0] = Math.min(intervals[i-1][0], intervals[i][0]);
                intervals[i][1] = Math.max(intervals[i][1], intervals[i-1][1]);
            }else{
                res.add(intervals[i-1]);
            }
        }
        res.add(intervals[intervals.length-1]);
        int n = res.size();
        int[][] arr = new int[n][2];
        for(int i = 0; i < n; i ++){
            arr[i] = res.get(i);
        }
        return arr;
    }
}
在这里插入代码片

二、力扣42. 接雨水

class Solution {
    public int trap(int[] height) {
        Deque<Integer> deq = new LinkedList<>();
        int sum = 0;
        if(height.length <= 2){
            return sum;
        }
        deq.offerLast(0);
        for(int i = 1; i < height.length; i ++){
            int pre = height[deq.peekLast()];
            if(height[i] < pre){
                deq.offerLast(i);
            }else if(height[i] == pre){
                deq.pollLast();
                deq.offerLast(i);
            }else{
                while(!deq.isEmpty() && height[i] > pre){
                    int mid = deq.pollLast();
                    if(!deq.isEmpty()){
                        int p = deq.peekLast();
                        int h = Math.min(height[p], height[i]) - height[mid];
                        int c = i - p - 1;
                        if(h * c > 0){
                            sum += h * c;
                        }
                        pre = height[deq.peekLast()];
                    }
                }
                deq.offerLast(i);
            }
        }
        return sum;
    }
}

三、力扣72. 编辑距离

class Solution {
    public int minDistance(String word1, String word2) {
        int m = word1.length(), n = word2.length();
        int[][] dp = new int[m+1][n+1];
        for(int i = 0; i <= m; i ++){
            dp[i][0] = i;
        }
        for(int i = 0; i <= n; i ++){
            dp[0][i] = i;
        }
        for(int i = 1; i <= m; i ++){
            for(int j = 1; j <= n; j ++){
                if(word1.charAt(i-1) == word2.charAt(j-1)){
                    dp[i][j] = dp[i-1][j-1];
                }else{
                    dp[i][j] = Math.min(dp[i-1][j], Math.min(dp[i-1][j-1], dp[i][j-1])) + 1;
                }
            }
        }
        return dp[m][n];
    }
}

四、力扣124. 二叉树中的最大路径和

在这里插入代码片/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int res = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        fun(root);
        return res;
    }
    public int fun(TreeNode root){
        if(root == null){
            return 0;
        }
        int l = Math.max(0, fun(root.left));
        int r = Math.max(0, fun(root.right));
        res = Math.max(res, l+r+root.val);
        return l > r ? l + root.val : r + root.val;
    }
}

五、力扣142. 环形链表 II

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head == null || head.next == null){
            return null;
        }
        ListNode fast = new ListNode(-1, head);
        ListNode slow = new ListNode(-1, head);
        while(fast.next != null && slow.next != null){
            if(fast.next.next != null){
                fast = fast.next.next;
                slow = slow.next;
            }else{
                return null;
            }
            if(fast == slow){
                ListNode p = new ListNode(-1, head);
                while(p != slow){
                    p = p.next;
                    slow = slow.next;
                }
                return p;
            }
        }
        return null;
    }
}

六、力扣19. 删除链表的倒数第 N 个结点

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode fast = new ListNode(-1, head);
        ListNode slow = new ListNode(-1, head);
        while(n -- > 0){
            fast = fast.next;
        }
        while(fast != null){
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }
}

七、力扣4. 寻找两个正序数组的中位数

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int m = nums1.length, n = nums2.length;
        int[] arr = new int[m+n];
        int i = 0, j = 0, k = 0;
        while(i < m && j < n){
            if(nums1[i] < nums2[j]){
                arr[k ++] = nums1[i ++];
            }else{
                arr[k ++] = nums2[j ++];
            }
        }
        while(i < m){
            arr[k ++] = nums1[i ++];
        }
        while(j < n){
            arr[k ++] = nums2[j ++];
        }
        if((m+n) % 2 == 0){
            int cur = (m+n) / 2;
            double a = arr[cur-1];
            double b = arr[cur];
            return (a+b)/2;
        }else{
            return (double)arr[(m+n)/2];
        }
    }
}

八、力扣94. 二叉树的中序遍历

在这里插入代码片/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if(root == null){
            return res;
        }
        Deque<TreeNode> deq = new LinkedList<>();
        TreeNode p = root;
        while(p != null || !deq.isEmpty()){
            if(p != null){
                deq.offerLast(p);
                p = p.left;
            }else{
                p = deq.pollLast();
                res.add(p.val);
                p = p.right;
            }
        }
        return res;
    }
}

九、力扣148. 排序链表

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        List<Integer> list = new ArrayList<>();
        ListNode p = head;
        while(p != null){
            list.add(p.val);
            p = p.next;
        }
        list.sort(Comparator.comparingInt(o -> o));
        ListNode L = new ListNode(-1, head);
        p = L;
        for(int a : list){
            ListNode cur = new ListNode(a, null);
            p.next = cur;
            p = p.next;
        }
        return L.next;
    }
}

十、力扣2. 括号生成

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> res = new ArrayList<>();
        if(n == 0){
            return res;
        }
        fun("", n, n, res);
        return res;
    }
    public void fun(String cur, int l, int r, List<String> res){
        if(l == 0 && r == 0){
            res.add(cur);
            return ;
        }
        if(l > r){
            return ;
        }
        if(l > 0){
            fun(cur + "(", l-1, r, res);
        }
        if(r > l && r > 0){
            fun(cur + ")", l , r-1, res);
        }
    }
}

十一、力扣31. 下一个排列

class Solution {
    public void nextPermutation(int[] nums) {
        int n = nums.length;
        if(n <= 1){
            return;
        }
        int i = n - 2;
        int j = n - 1;
        int k = n - 1;
        while(i >= 0 && nums[i] >= nums[j]){
            i --;
            j --;
        }
        if(i >= 0){
            while(nums[i] >= nums[k]){
                k --;
            }
            swap(nums, i, k);
        }
        reverse(nums, j, n-1);
    }
    public void swap(int[] nums, int left, int right){
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }
    public void reverse(int[] nums, int start, int end){
        while(start < end){
            swap(nums, start, end);
            start ++;
            end --;
        }
    }
}

十二、力扣239. 滑动窗口最大值

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        Deque<Integer> deq = new LinkedList<>();
        List<Integer> list = new ArrayList<>();
        for(int i = 0; i < nums.length; i ++){
            if(!deq.isEmpty() && deq.peekFirst() <= i-k){
                deq.pollFirst();
            }
            if(deq.isEmpty()){
                deq.offerLast(i);
            }else{
                while(!deq.isEmpty() && nums[i] > nums[deq.peekLast()]){
                    deq.pollLast();
                }
                deq.offerLast(i);
            }
            if(i >= k-1){
                list.add(nums[deq.peekFirst()]);
            }
        }
        int[] res = list.stream().mapToInt(Integer::intValue).toArray();
        return res;
    }
}

十三、力扣2. 两数相加

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = new ListNode(-1, null);
        ListNode pre = head, p1 = l1, p2 = l2;
        int k = 0;
        while(p1 != null && p2 != null){
            int cur = p1.val + p2.val + k;
            if(cur > 9){
                k = cur / 10;
                cur = cur % 10;
            }else{
                k = 0;
            }
            ListNode t = new ListNode(cur, null);
            pre.next = t;
            pre = pre.next;
            p1 = p1.next;
            p2 = p2.next;
        }
        while(p1 != null){
            int cur = p1.val + k;
            if(cur > 9){
                k = cur / 10;
                cur = cur % 10;
            }else{
                k = 0;
            }
            ListNode t = new ListNode(cur, null);
            pre.next = t;
            pre = pre.next;
            p1 = p1.next;
        }
        while(p2 != null){
            int cur = p2.val + k;
            if(cur > 9){
                k = cur / 10;
                cur = cur % 10;
            }else{
                k = 0;
            }
            ListNode t = new ListNode(cur, null);
            pre.next = t;
            pre = pre.next;
            p2 = p2.next;
        }
        if(k != 0){
            ListNode t = new ListNode(k, null);
            pre.next = t;
            pre = pre.next;
        }
        return head.next;
    }
}

十四、力扣70. 爬楼梯

class Solution {
    public int climbStairs(int n) {
        if(n <= 2){
            return n;
        }
        int[] dp = new int[n+1];
        dp[1] = 1;
        dp[2] = 2;
        for(int i = 3; i <= n; i ++){
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }
}

十五、力扣32. 最长有效括号

class Solution {
    public int longestValidParentheses(String s) {
        int res = 0;
        int left = 0, right = 0;
        for(int i = 0; i < s.length(); i ++){
            if(s.charAt(i) == '('){
                left ++;
            }else{
                right ++;
            }
            if(right > left){
                right = 0;
                left = 0;
            }else if(right == left){
                res = Math.max(res, 2* right);
            }
        }
        left = 0;
        right = 0;
        for(int i = s.length()-1; i >= 0; i --){
            if(s.charAt(i) == ')'){
                right ++;
            }else{
                left ++;
            }
            if(left > right){
                left = 0;
                right = 0;
            }else if(left == right){
                res = Math.max(res, 2*left);
            }
        }
        return res;
    }
}

十六、力扣322. 零钱兑换

在这里插入代码片class Solution {
    public int coinChange(int[] coins, int amount) {
        int n = coins.length;
        int[] dp = new int[amount+1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        for(int i = 0; i < n; i ++){
            for(int j = coins[i]; j <= amount; j ++){
                int t = dp[j-coins[i]] == Integer.MAX_VALUE ? Integer.MAX_VALUE : dp[j-coins[i]]+1;
                dp[i] = Math.min(dp[j], t);
            }
        }
        return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
    }
}

十七、力扣76. 最小覆盖子串

class Solution {
    public String minWindow(String s, String t) {
        String res = s + "-";
        Map<Character,Integer> map = new HashMap<>();
        for(char c : t.toCharArray()){
            map.put(c, map.getOrDefault(c,0)+1);
        }
        int left = 0, right = 0;
        int count = map.size();
        char[] sh = s.toCharArray();
        while(right < s.length()){
            if(map.containsKey(sh[right])){
                map.put(sh[right], map.get(sh[right])-1);
                if(map.get(sh[right]) == 0){
                    count --;
                }
            }
            right ++;
            while(left < right && count == 0){
                if(map.containsKey(sh[left])){
                    if(map.get(sh[left]) == 0){
                        res = right - left < res.length() ? s.substring(left,right) : res;
                        count ++;
                    }
                    map.put(sh[left], map.get(sh[left]) + 1);
                }
                left ++;
            }
        }
        return res.equals(s + "-") ? "" : res;
    }
}

十八、力扣105. 从前序与中序遍历序列构造二叉树

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    Map<Integer,Integer> map = new HashMap<>();
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        for(int i = 0; i < inorder.length; i ++){
            map.put(inorder[i], i);
        }
        return fun(preorder, inorder, 0, preorder.length-1, 0, inorder.length-1);
    }
    public TreeNode fun(int[] preorder, int[] inorder,int preStart,int preEnd,int inStart,int inEnd){
        if(preStart > preEnd){
            return null;
        }
        TreeNode cur = new TreeNode(preorder[preStart]);
        int index = map.get(preorder[preStart]);
        cur.left = fun(preorder, inorder, preStart+1, preStart+index-inStart, inStart, index-1);
        cur.right = fun(preorder, inorder, preStart+index-inStart+1, preEnd, index+1, inEnd);
        return cur;
    }
}

十九、力扣78. 子集

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> path = new ArrayList<>();
    public List<List<Integer>> subsets(int[] nums) {
        res.add(new ArrayList<>());
        fun(nums, 0);
        return res;
    }
    public void fun(int[] nums, int index){
        
        for(int i = index; i < nums.length; i ++){
            path.add(nums[i]);
            res.add(new ArrayList<>(path));
            fun(nums, i + 1);
            path.remove(path.size()-1);
        }
    }
}

二十、力扣155. 最小栈

class MinStack {
    Deque<Integer> deq = new ArrayDeque<>();
    Deque<Integer> deqMin = new ArrayDeque<>();

    public MinStack() {
        
    }
    
    public void push(int val) {
        deq.offerLast(val);
        if(deqMin.isEmpty() || val <= deqMin.peekLast()){
            deqMin.offerLast(val);
        }
    }
    
    public void pop() {
        int val = deq.pollLast();
        if(!deqMin.isEmpty() && deqMin.peekLast() == val){
            deqMin.pollLast();
        }
    }
    
    public int top() {
        return deq.peekLast();
    }
    
    public int getMin() {
        return deqMin.peekLast();
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

二十一、力扣101. 对称二叉树

在这里插入代码片/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
        return fun(root.left, root.right);
    }
    public boolean fun(TreeNode l, TreeNode r){
        if(l == null && r == null){
            return true;
        }
        if((l == null && r != null) || (l != null && r == null)){
            return false;
        }
        if(l.val != r.val){
            return false;
        }
        boolean bl = fun(l.left, r.right);
        boolean br = fun(l.right, r.left);
        return bl && br;
    }
}

二十二、力扣104. 二叉树的最大深度

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
        return fun(root);
    }
    public int fun(TreeNode root){
        if(root == null){
            return 0;
        }
        int l = fun(root.left);
        int r = fun(root.right);
        return l > r ? l + 1 : r + 1;
    }
}

二十三、力扣34. 在排序数组中查找元素的第一个和最后一个位置

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] res = new int[]{-1,-1};
        if(nums == null || nums.length == 0){
            return res;
        }
        int left = firstIndex(nums, target);
        int right = secondIndex(nums, target);
        res[0] = left;
        res[1] = right;
        return res;
    }
    public int firstIndex(int[] nums, int target){
        int left = 0, right = nums.length-1;
        while(left <= right){
            int mid = (right - left)/2 + left;
            if(nums[mid] > target){
                right = mid - 1;
            }else if(nums[mid] < target){
                left = mid + 1;
            }else{
                while(mid > 0 && nums[mid] == nums[mid-1]){
                    mid --;
                }
                return mid;
            }
        }
        return -1;
    }
    public int secondIndex(int[] nums, int target){
        int left = 0, right = nums.length-1;
        while(left <= right){
            int mid = (right - left)/2 + left;
            if(nums[mid] > target){
                right = mid - 1;
            }else if(nums[mid] < target){
                left = mid + 1;
            }else{
                while(mid < nums.length-1 && nums[mid] == nums[mid+1]){
                    mid ++;
                }
                return mid;
            }
        }
        return -1;
    }
}

二十四、力扣39. 组合总和

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> path = new ArrayList<>();
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        Arrays.sort(candidates);
        fun(candidates, target, 0, 0);
        return res;
    }
    public void fun(int[] candidates, int target, int cur, int sum){
        if(sum == target){
            res.add(new ArrayList<>(path));
            return;
        }
        for(int i = cur; i < candidates.length; i ++){
            if(cur + sum > target){
                return ;
            }
            path.add(candidates[i]);
            fun(candidates, target, i, sum+candidates[i]);
            path.remove(path.size() - 1);
        }
    }
}

二十五、力扣394. 字符串解码

**class Solution {
    public String decodeString(String s) {
        Deque<Integer> deq = new LinkedList<>();
        Deque<StringBuilder> dsb = new LinkedList<>();
        StringBuilder cur = new StringBuilder();
        int k = 0;
        for(char c : s.toCharArray()){
            if(Character.isDigit(c)){
                k = k * 10 + (c-'0');
            }else if(c == '['){
                dsb.offerLast(cur);
                deq.offerLast(k);
                cur = new StringBuilder();
                k = 0;
            }else if(c == ']'){
                int t = deq.pollLast();
                StringBuilder pre = dsb.pollLast();
                for(int i = 0; i < t; i ++){
                    pre.append(cur);
                }
                cur = pre;
            }else{
                cur.append(c);
            }
        }
        return cur.toString();
    }
}**

二十六、力扣64. 最小路径和

class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int[][] dp = new int[m][n];
        for(int i = 0, j = 0; i < m; i ++){
            j += grid[i][0];
            dp[i][0] = j;
        }
        for(int i = 0, j = 0; i < n; i ++){
            j += grid[0][i];
            dp[0][i] = j;
        }
        for(int i = 1; i < m; i ++){
            for(int j = 1; j < n; j ++){
                dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
            }
        }
        return dp[m-1][n-1];
    }
}

二十七、力扣48. 旋转图像

class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        for(int i = 0; i < n; i ++){
            for(int j = i+1; j < n; j ++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
        for(int i = 0; i < n; i ++){
            for(int j = 0; j < n/2; j ++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[i][n-j-1];
                matrix[i][n-j-1] = temp;
            }
        }
    }
}

二十八、力扣240. 搜索二维矩阵 II

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length, n = matrix[0].length;
        for(int i = 0, j = n-1; i < m && j >= 0; ){
            if(target == matrix[i][j]){
                return true;
            }else if(target > matrix[i][j]){
                i ++;
            }else{
                j --;
            }
        }
        return false;
    }
}

二十九、力扣98. 验证二叉搜索树

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<Integer> res = new ArrayList<>();
    public boolean isValidBST(TreeNode root) {
        fun(root);
        if(res.size() == 1){
            return true;
        }
        for(int i = 1; i < res.size(); i ++){
            if(res.get(i) <= res.get(i-1)){
                return false;
            }
        }
        return true;
    }
    public void fun(TreeNode root){
        if(root == null){
            return ;
        }
        fun(root.left);
        res.add(root.val);
        fun(root.right);
    }
}

三十、力扣543. 二叉树的直径

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int res = 0;
    public int diameterOfBinaryTree(TreeNode root) {
        fun(root);
        return res;
    }
    public int fun(TreeNode root){
        if(root == null){
            return 0;
        }
        int l = fun(root.left);
        int r = fun(root.right);
        res = Math.max(res, l+r);
        return l > r ? l + 1 : r + 1;
    }
}

三十一、力扣221. 最大正方形

class Solution {
    public int maximalSquare(char[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        int[] dp = new int[n+1];
        int prev = 0;
        int res = 0;
        for(int i = 1; i <= m; i ++){
            prev = 0;
            for(int j = 1; j <= n; j ++){
                int temp = dp[j];
                if(matrix[i-1][j-1] == '1'){
                    dp[j] = Math.min(Math.min(dp[j],dp[j-1]), prev)+1;
                    res = Math.max(res, dp[j]);
                }else{
                    dp[j] = 0;
                }
                prev = temp;
            }
        }
        return res * res;
    }
}

三十二、力扣234. 回文链表

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        ListNode L = new ListNode(-1, head);
        ListNode f = L, s = L;
        while(f.next != null){
            f = f.next;
            s = s.next;
            if(f.next != null){
                f = f.next;
            }else{
                break;
            }
        }
        ListNode p = s, p2 = s, p1 = head;
        reverse(s);
        p = p.next;
        while(p != null){
            if(p1.val != p.val){
                return false;
            }
            p1 = p1.next;
            p = p.next;
        }
        reverse(p2);
        return true;
    }
    public void reverse(ListNode node){
        ListNode p = node.next;
        node.next = null;
        while(p != null){
            ListNode r = p;
            p = p.next;
            r.next = node.next;
            node.next = r;
        }
    }
}

三十三、力扣128. 最长连续序列

class Solution {
    public int longestConsecutive(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for(int n : nums){
            set.add(n);
        }
        int res = 0;
        for(int a : set){
            if(!set.contains(a-1)){
                int cur = a;
                int l = 1;
                while(set.contains(cur + 1)){
                    cur ++;
                    l ++;
                }
                res = Math.max(res, l);
            }
        }
        return res;
    }
}

三十四、力扣62. 不同路径

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];
        for(int i = 0; i < m; i ++){
            dp[i][0] = 1;
        }
        for(int i = 0; i < n; i ++){
            dp[0][i] = 1;
        }
        for(int i = 1; i < m; i ++){
            for(int j = 1; j < n; j ++){
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
    }
}

三十五、力扣152. 乘积最大子数组

class Solution {
    public int maxProduct(int[] nums) {
        int res = nums[0], max = nums[0], min = nums[0];
        for(int i = 1; i < nums.length; i ++){
            int cur = nums[i];
            int premax = max;
            int premin = min;
            max = Math.max(Math.max(cur, cur*premax), cur*premin);
            min = Math.min(Math.min(cur, cur*premax), cur*premin);
            res = Math.max(max, res);
        }
        return res;
    }
}

三十六、力扣198. 打家劫舍

class Solution {
    public int rob(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n];
        if(n == 1){
            return nums[0];
        }
        if(n == 2){
            return nums[0] > nums[1] ? nums[0] : nums[1];
        }
        dp[0] = nums[0];
        dp[1] = nums[0] > nums[1] ? nums[0] : nums[1];
        for(int i = 2; i < n; i ++){
            dp[i] = Math.max(dp[i-1], dp[i-2] + nums[i]);
        }
        return dp[n-1];
    }
}

三十七、力扣560. 和为 K 的子数组

class Solution {
    public int subarraySum(int[] nums, int k) {
        int count = 0;
        int presum = 0;
        Map<Integer, Integer> map = new HashMap<>();
        map.put(0,1);
        for(int i = 0; i < nums.length; i ++){
            presum += nums[i];
            if(map.containsKey(presum - k)){
                count += map.get(presum - k);
            }
            map.put(presum, map.getOrDefault(presum,0) + 1);
        }啊啊啊啊啊啊啊啊啊啊  
        return count;
    }
}

三十八、力扣169. 多数元素

class Solution {
    public int majorityElement(int[] nums) {
        int num = nums[0], count = 0;
        for(int a : nums){
            if(count == 0){
                num = a;
            }
            count += (num == a ? 1 : -1);
        }
        return num;
    }
}

三十八、力扣139. 单词拆分

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        Set<String> set = new HashSet<>(wordDict);
        int n = s.length();
        boolean[] dp = new boolean[n+1];
        dp[0] = true;
        for(int i = 1; i <= n; i ++){
            for(int j = 0; j < i; j ++){
                String sub = s.substring(j,i);
                if(dp[j] && set.contains(sub)){
                    dp[i] = true;
                }
            }
        }
        return dp[n];
    }
}

三十九、力扣226. 翻转二叉树

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        return fun(root);
    }
    public TreeNode fun(TreeNode root){
        if(root == null){
            return null;
        }
        TreeNode l = root.left;
        TreeNode r = root.right;
        fun(root.left);
        fun(root.right);
        root.left = r;
        root.right = l;
        return root;
    }
}

四十、力扣283. 移动零

class Solution {
    public void moveZeroes(int[] nums) {
        for(int i = 0, j = 0; j < nums.length; ){
            if(nums[j] != 0){
                nums[i] = nums[j];
                i ++; 
                j ++;
            }else{
                j ++;
            }
            if(j == nums.length){
                while(i < nums.length){
                    nums[i] = 0;
                    i ++;
                }
            }
        }
    }
}

四十一、力扣739. 每日温度

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        Deque<Integer> deq = new LinkedList<>();
        int n = temperatures.length;
        int[] res = new int[n];
        deq.offerLast(0);
        for(int i = 1; i < n; i ++){
            if(temperatures[i] < temperatures[deq.peekLast()]){
                deq.offerLast(i);
            }else{
                while(!deq.isEmpty() && temperatures[i] > temperatures[deq.peekLast()]){
                    int idx = deq.pollLast();
                    res[idx] = i - idx;
                }
                deq.offerLast(i);
            }
        }
        return res;
    }
}

四十二、力扣297. 二叉树的序列化与反序列化

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if(root == null){
            return "";
        }
        Deque<TreeNode> deq = new LinkedList<>();
        StringBuilder sb = new StringBuilder();
        deq.offerLast(root);
        while(!deq.isEmpty()){
            int size = deq.size();
            for(int i = 0; i < size; i ++){
                TreeNode cur = deq.pollFirst();
                if(cur == null){
                    sb.append("#").append(",");
                    continue;
                }
                sb.append(cur.val).append(",");
                deq.offerLast(cur.left);
                deq.offerLast(cur.right);
            }
        }
        return sb.toString();
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data.isEmpty()){
            return null;
        }
        String[] str = data.split(",");
        int idx = 0;
        Deque<TreeNode> deq = new ArrayDeque<>();
        TreeNode root = new TreeNode(Integer.parseInt(str[idx]));
        deq.offerLast(root);
        while(!deq.isEmpty()){
            int size = deq.size();
            for(int i = 0; i < size; i ++){
                TreeNode cur = deq.pollFirst();
                idx ++;
                if(!str[idx].equals("#")){
                    TreeNode l = new TreeNode(Integer.parseInt(str[idx]));
                    cur.left = l;
                    deq.offerLast(l);
                }
                idx ++;
                if(!str[idx].equals("#")){
                    TreeNode r = new TreeNode(Integer.parseInt(str[idx]));
                    cur.right = r;
                    deq.offerLast(r);
                }
            }
        }
        return root;
    }
}

// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));

四十二、力扣207. 课程表

class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        int n = numCourses;
        List<List<Integer>> graph = new ArrayList<>();
        int[] indrgee = new int[n];
        for(int i = 0; i < n; i ++){
            graph.add(new ArrayList<>());
        }
        for(int[] arr : prerequisites){
            int course = arr[0];
            int pre = arr[1];
            graph.get(pre).add(course);
            indrgee[course] ++;
        }
        Deque<Integer> deq = new LinkedList<>();
        for(int i = 0; i < n; i ++){
            if(indrgee[i] == 0){
                deq.offerLast(i);
            }
        }
        int count = 0;
        while(!deq.isEmpty()){
            int course = deq.pollFirst();
            count ++;
            for(int cur : graph.get(course)){
                indrgee[cur] --;
                if(indrgee[cur] == 0){
                    deq.offerLast(cur);
                }
            }
        }
        return count == n;
    }
}

四十二、力扣79. 单词搜索

class Solution {
    public boolean exist(char[][] board, String word) {
        int m = board.length, n = board[0].length;
        for(int i = 0; i < m; i ++){
            for(int j = 0; j < n; j ++){
                if(dfs(board, word, 0, i , j)){
                    return true;
                }
            }
        }
        return false;
    }
    public boolean dfs(char[][] board, String word, int idx, int i, int j){
        if(i < 0 || i >= board.length || j < 0 || j >= board[0].length 
            || board[i][j] != word.charAt(idx)){
            return false;
        }
        if(idx == word.length()-1){
            return true;
        }
        char temp = board[i][j];
        board[i][j] = '#';
        boolean res = dfs(board, word, idx+1, i+1, j) ||
                      dfs(board, word, idx+1, i-1, j) ||
                      dfs(board, word, idx+1, i, j+1) ||
                      dfs(board, word, idx+1, i, j-1);
        board[i][j] = temp;
        return res;
    }
}

四十二、力扣136. 只出现一次的数字

class Solution {
    public int singleNumber(int[] nums) {
        int res = 0;
        for(int a : nums){
            res ^= a;
        }
        return res;
    }
}

四十二、力扣11. 盛最多水的容器

class Solution {
    public int maxArea(int[] height) {
        int res = 0;
        int left = 0, rigth = height.length-1;
        while(left < rigth){
            int cur = Math.min(height[left], height[rigth]) * (rigth - left);
            if(height[left] < height[rigth]){
                left ++;
            }else{
                rigth --;
            }
            res = Math.max(res, cur);
        }
        return res;
    }
}

四十二、力扣55. 跳跃游戏

class Solution {
    public boolean canJump(int[] nums) {
        int cur = 0;
        for(int i = 0; i < nums.length; i ++){
            if(cur < i){
                return false;
            }
            cur = Math.max(cur, i+nums[i]);
        }
        return true;
    }
}

四十二、力扣114. 二叉树展开为链表

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<TreeNode> res = new ArrayList<>();
    public void flatten(TreeNode root) {
        fun(root);
        for(int i = 1; i < res.size(); i ++){
            TreeNode pre = res.get(i-1);
            TreeNode cur = res.get(i);
            pre.right = cur;
            pre.left = null;
        }
    }
    public void fun(TreeNode root){
        if(root == null){
            return;
        }
        res.add(root);
        fun(root.left);
        fun(root.right);
    }
}

四十二、力扣75. 颜色分类

class Solution {
    public void sortColors(int[] nums) {
        int l = 0, i = 0, r = nums.length-1;
        while(i <= r){
            if(nums[i] == 0){
                swap(nums, l, i);
                l ++;
                i ++;
            }else if(nums[i] == 2){
                swap(nums, r, i);
                r --;
            }else{
                i ++;
            }
        }
    }
    public void swap(int[] nums, int a, int b){
        int temp = nums[a];
        nums[a] = nums[b]; 
        nums[b] = temp;
    }
}

四十二、力扣10. 正则表达式匹配

class Solution {
    public boolean isMatch(String s, String p) {
        int m = s.length(), n = p.length();
        boolean[][] dp = new boolean[m+1][n+1];
        dp[0][0] = true;
        for(int j = 2; j <= n; j ++){
            if(p.charAt(j-1) == '*'){
                dp[0][j] = dp[0][j-2];
            }
        }
        for(int i = 1; i <= m; i ++){
            for(int j = 1; j <= n; j ++){
                if(p.charAt(j-1) != '*'){
                    dp[i][j] = dp[i-1][j-1] && 
                    (s.charAt(i-1) == p.charAt(j-1) || p.charAt(j-1) == '.');
                }else{
                    dp[i][j] = dp[i][j-2] || 
                    (dp[i-1][j] && (s.charAt(i-1) == p.charAt(j-2) || p.charAt(j-2) == '.'));
                }
            }
        }
        return dp[m][n];
    }
}

四十二、力扣347. 前 K 个高频元素

在这里插入代码片class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int a : nums){
            map.put(a, map.getOrDefault(a,0)+1);
        }
        List<List<Integer>> bucket = new ArrayList<>();

        for(int i = 0; i < nums.length+1; i ++){
            bucket.add(new ArrayList<>());
        }
        for(int key : map.keySet()){
            int fre = map.get(key);
            bucket.get(fre).add(key);
        }
        List<Integer> res = new ArrayList<>();
        for(int i = bucket.size() - 1; i >= 0 && k > 0; i --){
            if(!bucket.get(i).isEmpty()){
                for(int a : bucket.get(i)){
                    if(k > 0){
                        res.add(a);
                        k --;
                    }else{
                        break;
                    }
                }
            }
        }
        int[] arr = new int[res.size()];
        for(int i = 0; i < arr.length; i ++){
            arr[i] = res.get(i);
        }
        return arr;
    }
}

四十二、力扣208. 实现 Trie (前缀树)

class Trie {
    private TreeNode root;

    public Trie() {
        root = new TreeNode();
    }
    
    public void insert(String word) {
        TreeNode node = root;
        for(char c : word.toCharArray()){
            if(node.children[c-'a'] == null){
                node.children[c-'a'] = new TreeNode();
            }
            node = node.children[c-'a'];
        }
        node.isEnd = true;
    }
    
    public boolean search(String word) {
        TreeNode node = fun(word);
        return node != null && node.isEnd;
    }
    
    public boolean startsWith(String prefix) {
        TreeNode node = fun(prefix);
        return node != null;
    }
    private TreeNode fun(String word){
        TreeNode node = root;
        for(char c : word.toCharArray()){
            if(node.children[c-'a'] == null){
                return null;
            }
            node = node.children[c-'a'];
        }
        return node;
    }

    private static class TreeNode{
        boolean isEnd = false;
        TreeNode[] children = new TreeNode[26];
    }
}

/**
 * Your Trie object will be instantiated and called as such:
 * Trie obj = new Trie();
 * obj.insert(word);
 * boolean param_2 = obj.search(word);
 * boolean param_3 = obj.startsWith(prefix);
 */

四十二、力扣96. 不同的二叉搜索树

class Solution {
    public int numTrees(int n) {
        if(n <= 2){
            return n;
        }
        if(n == 3){
            return 5;
        }
        int[] dp = new int[n+1];
        dp[0] = 1;
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 5;
        for(int i = 4; i <= n; i ++){
            for(int j = 1; j <= i; j ++){
                dp[i] += (dp[j-1] * dp[i-j]);
            }
        }
        return dp[n];
    }
}

四十二、力扣287. 寻找重复数

class Solution {
    public int findDuplicate(int[] nums) {
        int fast = nums[0];
        int slow = nums[0];
        do{
            slow = nums[slow];
            fast = nums[nums[fast]];
        }while(slow != fast);
        slow = nums[0];
        while(slow != fast){
            slow = nums[slow];
            fast = nums[fast];
        }
        return slow;
    }
}

四十二、力扣85. 最大矩形

class Solution {
    public int maximalRectangle(char[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        int[] row = new int[n];
        int res = 0;
        for(char[] ch : matrix){
            for(int i = 0; i < n; i ++){
                row[i] = ch[i] == '1' ? row[i] + 1 : 0;
            }
            res = Math.max(res, fun(row));
        }
        return res;
    }
    public int fun(int[] high){
        Deque<Integer> deq = new LinkedList<>();
        int[] newhigh = new int[high.length+2];
        System.arraycopy(high, 0, newhigh, 1, high.length);
        int res = 0;
        for(int i = 0; i < newhigh.length; i ++){
            while(!deq.isEmpty() && newhigh[deq.peekLast()] > newhigh[i]){
                int h = newhigh[deq.pollLast()];
                res = Math.max(res, h * (i-deq.peekLast()-1));
            }
            deq.offerLast(i);
        }
        return res;
    }
}

四十二、力扣84. 柱状图中最大的矩形

class Solution {
    public int largestRectangleArea(int[] heights) {
        int res = 0;
        int[] newHigh = new int[heights.length+2];
        System.arraycopy(heights, 0, newHigh, 1, heights.length);
        Deque<Integer> deq = new LinkedList<>();
        for(int i = 0; i < newHigh.length; i ++){
            while(!deq.isEmpty() && newHigh[deq.peekLast()] > newHigh[i]){
                int h = newHigh[deq.pollLast()];
                res = Math.max(res, h * (i - deq.peekLast() - 1));
            }
            deq.offerLast(i);
        }
        return res;
    }
}

四十二、力扣494. 目标和

在这里插入代码片class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        int sum = 0;
        for(int a : nums){
            sum += a;
        }
        if((sum+target)%2 != 0 || (sum+target) < 0){
            return 0;
        }
        int len = (sum+target)/2;
        int[] dp = new int[len+1];
        dp[0] = 1;
        for(int a : nums){
            for(int j = len; j >= a; j --){
                dp[j] += dp[j-a];
            }
        }
        return dp[len];
    }
}

四十二、力扣253. 会议室 II

	/**
 * Definition of Interval:
 * public class Interval {
 *     int start, end;
 *     Interval(int start, int end) {
 *         this.start = start;
 *         this.end = end;
 *     }
 * }
 */

public class Solution {
    /**
     * @param intervals: an array of meeting time intervals
     * @return: the minimum number of conference rooms required
     */
    public int minMeetingRooms(List<Interval> intervals) {
        // Write your code here
        if(intervals == null || intervals.size() == 0){
            return 0;
        }
        intervals.sort(Comparator.comparingInt(a -> a.start));
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        for(Interval cur : intervals){
            if(!pq.isEmpty() && cur.start >= pq.peek()){
                pq.poll();
            }
            pq.offer(cur.end);
        }
        return pq.size();
    }
}

四十二、力扣279. 完全平方数

class Solution {
    public int numSquares(int n) {
        int m = (int) Math.sqrt(n);
        int[] arr = new int[m+1];
        for(int i = 1; i <= m; i ++){
            arr[i] = i*i;
        }
        int[] dp = new int[n+1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        for(int i = 1; i <= m; i ++){
            for(int j = arr[i]; j <= n; j ++){
                if(dp[j- arr[i]] != Integer.MAX_VALUE){
                    dp[j] = Math.min(dp[j], dp[j - arr[i]]+1);
                }
            }
        }
        return dp[n];
    }
}

四十二、力扣416. 分割等和子集

class Solution {
    public boolean canPartition(int[] nums) {
        int sum = 0;
        for(int a : nums){
            sum += a;
        }
        if(sum % 2 != 0){
            return false;
        }
        sum /= 2;
        int[] dp = new int[sum+1];
        for(int i = 0; i < nums.length; i ++){
            for(int j = sum; j >= nums[i]; j --){
                dp[j] = Math.max(dp[j], dp[j-nums[i]] + nums[i]);
            }
        }
        return dp[sum] == sum;
    }
}

四十二、力扣647. 回文子串

class Solution {
    public int countSubstrings(String s) {
        int res = 0;
        for(int i = 0; i < s.length(); i ++){
            int a = fun(s, i, i);
            int b = fun(s, i, i+1);
            res += (a+b);
        }
        return res;
    }
    public int fun(String s, int l, int r){
        int res = 0;
        for( ; l >= 0 && r < s.length(); l --, r ++){
            if(s.charAt(l) != s.charAt(r)){
                return res;
            }else{
                res ++;
            }
        }
        return res;
    }
}

四十二、力扣301. 删除无效的括号

class Solution {
    public List<String> removeInvalidParentheses(String s) {
        List<String> res = new ArrayList<>();
        Deque<String> deq = new LinkedList<>();
        Set<String> set = new HashSet<>();
        deq.offerLast(s);
        set.add(s);
        boolean flag = false;
        while(!deq.isEmpty()){
            String cur = deq.pollFirst();
            if(fun(cur)){
                res.add(cur);
                flag = true;
            }
            if(flag){
                continue;
            }
            for(int i = 0; i < cur.length(); i ++){
                if(cur.charAt(i) != '(' && cur.charAt(i) != ')'){
                    continue;
                }
                String str = cur.substring(0,i) + cur.substring(i+1);
                if(!set.contains(str)){
                    set.add(str);
                    deq.offerLast(str);
                }
            }
        }
        return res;
    }
    public boolean fun(String s){
        int count = 0;
        for(char c : s.toCharArray()){
            if(c == '('){
                count ++;
            }else if(c == ')'){
                if(count == 0){
                    return false;
                }
                count --;
            }
        }
        return count == 0;
    }
}

四十二、力扣337. 打家劫舍 III

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int rob(TreeNode root) {
        int[] res = fun(root);
        return Math.max(res[0], res[1]);
    }
    public int[] fun(TreeNode root){
        if(root == null){
            return new int[]{0,0};
        }
        int[] l = fun(root.left);
        int[] r = fun(root.right);
        int[] cur = new int[]{0,0};
        cur[0] = root.val + l[1] + r[1];
        cur[1] = Math.max(l[0],l[1]) + Math.max(r[0], r[1]);
        return cur;
    }
}

四十二、力扣17. 电话号码的字母组合

class Solution {
    List<String> res = new ArrayList<>();
    StringBuilder sb = new StringBuilder();
    String[] str = new String[]{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    public List<String> letterCombinations(String digits) {
        if(digits.equals("")){
            return res;
        }
        fun(digits, 0);
        return res;
    }
    public void fun(String digits, int cur){
        if(sb.length() >= digits.length()){
            res.add(sb.toString());
            return;
        }
        String s = str[digits.charAt(cur) - '0'];
        for(int i = 0; i < s.length(); i ++){
            sb.append(s.charAt(i));
            fun(digits, cur+1);
            sb.deleteCharAt(sb.length()-1);
        }
    }
}

四十二、力扣438. 找到字符串中所有字母异位词

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> res = new ArrayList<>();
        int slen = s.length(), plen = p.length();
        int[] sarr = new int[26];
        int[] parr = new int[26];
        if(slen < plen){
            return res;
        }
        for(int i = 0; i < plen; i ++){
            sarr[s.charAt(i) - 'a'] ++;
            parr[p.charAt(i) - 'a'] ++;
        }
        int l = 0, r = plen - 1;
        while(r < slen){
            boolean flag = true;
            for(int i = 0; i < 26; i ++){
                if(sarr[i] != parr[i]){
                    flag = false;
                }
            }
            if(flag){
                res.add(l);
            }
            r ++;
            if(r >= slen){
                break;
            }
            sarr[s.charAt(r) - 'a'] ++;
            sarr[s.charAt(l) - 'a'] --;
            l ++;
        }
        return res;
    }
}


四十二、力扣617. 合并二叉树

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        return fun(root1, root2);
    }
    public TreeNode fun(TreeNode root1, TreeNode root2){
        if(root1 == null && root2 == null){
            return null;
        }
        if(root1 == null && root2 != null){
            return root2;
        }
        if(root1 != null && root2 == null){
            return root1;
        }
        root1.val += root2.val;
        root1.left = fun(root1.left, root2.left);
        root1.right = fun(root1.right, root2.right);
        return root1;
    }
}

四十二、力扣49. 字母异位词分组

class Solution {
List<List> res = new ArrayList<>();
public List<List> groupAnagrams(String[] strs) {
Map<String,List> map = new HashMap<>();
for(String s : strs){
int[] arr = new int[26];
for(char c : s.toCharArray()){
arr[c-‘a’] ++;
}
String s1 = “”;
for(int i = 0; i < arr.length; i ++){
if(arr[i] != 0){
s1 += i;
s1 += “_”;
s1 += arr[i];
}
}
if(!map.containsKey(s1)){
map.put(s1, new ArrayList<>());
}
List list = map.get(s1);
list.add(s);
}
for(String ss : map.keySet()){
List l1 = map.get(ss);
res.add(l1);
}
return res;
}
}

四十二、力扣437. 路径总和 III

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    Map<Long,Integer> map = new HashMap<>();
    long curPath , targetSum;
    int res = 0;
    public int pathSum(TreeNode root, int targetSum) {
        this.curPath = 0L;
        this.targetSum = targetSum;
        map.put(0L, 1);
        fun(root, targetSum);
        return res;
    }
    public void fun(TreeNode root, int targetSum){
        if(root == null){
            return;
        }
        curPath += root.val;
        res += map.getOrDefault(curPath-targetSum,0);
        map.put(curPath, map.getOrDefault(curPath,0) + 1);
        fun(root.left, targetSum);
        fun(root.right, targetSum);
        map.put(curPath, map.getOrDefault(curPath,0) - 1);
        curPath -= root.val;
    }
}
Cadence HDL原理图库避坑指南:从Excel导入引脚到解决‘V- V+’报错(附FPGA实例) 本文详细介绍了Cadence HDL原理图库的高效构建与排错方法,重点讲解如何从Excel智能导入引脚数据并优化FPGA封装设计。通过数据预处理、智能导入和深度排错三个关键阶段,帮助工程师避免常见错误如‘V- V+’报错,提升设计效率和准确性。 阅读详情

相关推荐

电力电子技术复习笔记

通常在开关过程前后加入谐振,使开关开通前电压先降到0,关断前电流先降到0,消除开关过程电压、电流的重叠,降低它们的变化率,从而大大减小甚至消除开关损耗。小信号线性化模型的原理:忽略开关频率分量和开关频率谐波分量及其边频分量,建立占空比、输入电压等的低频扰动对变换器中的电压、电流影响的模型。解:可以利用变压器的变比改变输出电压大小,避免控制过程的占空比过小或过大,提高控制精度,同时有利于减轻输出电路中电力电子器件的耐压要求。驱动电路:用于控制功率半导体器件的开关,从而控制电路的电流和电压。

Miracle Fan的博客 1万+

codetop标签树刷题(一)!!暴打面试官!!!!

个人复习

weixin_45962681的博客 1075

视觉SLAM与激光SLAM简单对比分析

本文旨在梳理目前较为前沿的SLAM技术,包括激光和视觉,主要从精度和实时性两个方面对算法进系评价。对于激光SLAM了解不深,后期需要补充相关算法的核心思想与算法框架。有问题请大佬们随时留言,我再改正。

超爱吃小蛋糕的66的博客 3854

codetop标签双指针题目大全解析(一),双指针刷穿地心!!!!!

这里有个十分关键的点,就是:原本的数组本身就是有序的,是一个非递减的数组,那么即使数组中元素有正有负,绝对值最大的元素肯定是在数组的两端的,即数组平方的最大值是在数组的两端的。假如nums1中才是数字出现少的那个,那么umap[nums1]会先到0,以至于res不了nums2的元素,假如nums2才是数字出现少的那个,那么if(nums2)会先空。这题考滑动窗口,但是考的很隐蔽,题目说只能移除nums最左边和最右边的元素,目标值是x,可以反着来,目标区间是中间的区域,目标值是sum - x。

weixin_45962681的博客 1171

CGNS快速入门到实战(二):VS配置调用CGNS静态链接库

CGNS快速入门到实战这一系列分成三篇文章展开叙述,具体有:(一)CGNS静态链接库编译;(二)VS配置调用CGNS静态链接库;(三)CGNS文件及案例展示。本篇文章重点讲述VS配置调用CGNS静态链接库。

ahang_99的博客 2618

人工智能渗透测试:自动化安全评估

渗透测试认证的价值包括提高可信度和技能水平,并帮助客户确保由经过认证的个人对其系统进行全面的手动调查。B2B 交互变得越来越复杂,特别是功能丰富的超级应用程序,需要采取强有力的安全预防措施,而自动化渗透测试应用程序则是一种未被发现的武器。渗透测试中的人工智能通过提高效率、自动收集信息、发现隐藏的漏洞、开发个性化攻击和减少误报来提高 B2B 集成的安全性。这包括风险简报、补救建议和战略建议。渗透测试由五个阶段组成,是网络安全中的关键防御措施,它模拟现实世界的攻击,以识别系统缺陷并在漏洞被利用之前解决它们。

weixin_48967543的博客 2362

codetop标签动态规划大全C++讲解(一)!!动态规划刷穿地心!!学吐了家人们o(╥﹏╥)o

主要供自己回顾学习,会持续更新,题源codetop动态规划+近半年1.零钱兑换2.零钱兑换II3.面试题08.11.硬币4.单词拆分5.最长递增子序列6.最长递增子序列的个数7.得到山形数组的最少删除次数8.最长公共子序列9.最长重复子数组10.最长等差数列11.最大子数组和12.最长的斐波那契子序列的长度13.最大正方形14.最长有效括号15.乘积最大子数组16.可被三整除的最大和17.回文子串数目18.最长回文子序列19.最长回文子串20.买卖股票的最佳时机21.买卖股票的最佳时机含手续费22.买卖股票

weixin_45962681的博客 1203

密码学:一文读懂数字证书

消息摘要算法用于验证数据完整性服务,对称加密算法和非对称加密算法用于保证数据保密性服务,数字签名算法用于抗否认性服务。数字证书集合了多种密码学算法:自身带有公钥信息,可完成相应的加密/解密操作;同时,还带有数字签名,可鉴别消息来源;且自身带有消息摘要信息,可验证证书的完整性;由于证书本身含有用户身份信息,因而具有认证性。

Shujie 2910

CodeTop 刷题记录

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。遍历数组 分别找到当前列左边和右边最高的 然后取较低的减去当前列的高度 就是当前列能存的水。ex:第i列 左边最高的 = max(i-1 列左边最高的, i-1 列的高度)

qq_39924723的博客 2051

Node.js内存溢出?一招搞定JavaScript heap out of memory错误(附永久配置方案)

本文深入解析Node.js内存溢出问题,提供从临时调整到永久配置的完整解决方案。重点介绍通过设置`max-old-space-size`参数和`NODE_OPTIONS`环境变量来扩展JavaScript堆内存限制,适用于Webpack、Vite等构建工具的大型项目场景,并涵盖Windows、Linux/macOS多平台配置方法。

cake8的博客 1057

文本纠错项目代码调试

文本纠错项目调试

m0_67084346的博客 868

算法刷题笔记(CodeTop)

简单易懂的题解和代码,持续更新ing

weixin_46905510的博客 6595

第二天 原来Labview语言结构也挺自然(2.1 顺序结构)

新建项目文件StructureTest.lvproj,新建四个子VI(FlatSequence.vi、CaseStructure.vi、LoopStructure.vi、EventStructure.vi),具体新建流程可以参考1.2节。

weixin_38637405的博客 1004

【CodeTop刷题日记1】 反转链表

说明 计划用C++,按照CodeTop网站进行刷题 链接在此:CodeTop 此网站将LeetCode中的面试高频题目,进行降序排列。 还可以按照欲面试公司进行筛选 因为近期并无面试计划,只是做准备,所以即按照默认顺序做题 已经很久没碰代码了,怕手生 题目1 反转链表 算是最经典的题目了吧,之前做过很多次,知道有很多种方法 但是还是不能保证每次都能做对 这个题当然可以再创建一个链表,然后再一个个头插法复制 但这样一个是容易出错,一个是还占用了存储空间 但要是想保留原来的链表那另说 在这我还是采用在原链

weixin_44649327的博客 814

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

CodeTop 刷题笔记 1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。两重循环遍历 时间复杂度:O(n2)构造hash表,key是数字,value是对应的index 遍历一遍数组,查找与当前元素对应的元素在hash表中是否存在,存在直接返回这两个,不存在则存入hash表 时间复杂度:O(n)...

上帝不会掷骰子的博客 155

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

力扣爆刷第120天之CodeTop100五连刷86-90

思路:所有的数字拼接成字符串之后的最大字符串,这里利用一个原理,两个字符串,如果x+y > y+x 那么就表示x > y,这个大于是指字符串拼接的前后顺序,更大的应该在前。题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/思路:求不同路径,非常简单,每个节点来自于他的左边和上边,故dp[i][j]=dp[i][j-1]+dp[i-1][j]。不持有的话,分为今天才不持有,和之前就不持有。

qq_43511039的博客 532

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

分享一个实用的突击面试手撕题的网站-CodeTop

网站首页是这样的,可以在上面选择你要去面试的公司和部门,面试前有针对的去刷一些出现概率高的题目,比如字节跳动、腾讯、美团等等,它是根据题目出现的频率由高到低排序的,当你想要做某一道题目时,直接点击该题目就可以跳转到leetcode相应的题目。同时你也可以通过爆料来为他人贡献自己的一份力量。该网站适合面试前突击一下,命中题目的概率提高。

2301_82014959的博客 2385

个人算法刷题笔记(CodeTop)

本文为自己为秋招准备的刷题记录,题目列表来自CodeTop。

Nimrod__的博客 3075

CodeTop做题记录

双指针法判断是否相交两个指针一起走pA走完A了就开始从headB开始接着走 pB走完B了就开始从headA接着走相交情况 A的前半段为a B的前半段为b 相交后的重合部分为cab相等 则会同时到达一个相交的节点处ab不等 则会pA走完a+c在走完b pB会走完b+c再走完a 即他俩都走了a+b+c 这么远后在相交节点相遇了不相交情况A的总长m和B总长nm和n相等 pA pB同时走到空mn不等 pA走完A再走完B pB走完B再走A pA pB都走完m+n同时为空 结束。

weixin_57108154的博客 1023

一个比肩leetcode的面试刷题网站

最近收集了不少好玩接地气的工具,分享给大家。说到面试刷题,我应该是比较有经验的,去年初本人正好换工作,也为面试做了很多准备,其中一个环节就是要复习大量的面试题,但是题目太分散,搜索引擎都要...

zz_jesse的博客 1856

CodeTop100 Day1

查询排n-k位的数,定义左右指针,若左等于右,直接返回nums[k],这是递归出口,获得将左指针第一个数当做比标,左指针找到大于等于该数的,右指针找到小于等于该数的,交换两者,最后排出该比标的正确位置,左边是比该值小的,右边是比该值大的,如果n-k,小于第一次排后的右指针则递归区间左半部分,否则递归右半部分。滑动窗口题,保存一个字母数组,维护左右指针,当遇到重复的,左指针右移,将移动的字符串去掉,直到满足要求,每次遍历更新答案,直到右指针为右端点,输出最大值;淘汰机制,去掉最不常用的。

Rsy0824的博客 652

力扣爆刷第109天之CodeTop100五连刷31-35

思路:编辑距离,定义dp[i][j]表示以word1[i]和word2[j]为结尾的字符串要相等所需的最少改动,如果word[i]==word[j]那么状态自然可以从上一个状态推导出来,即dp[i][j] = dp[i-1][j-1];如word[i]!= word[j],可以考虑增加、删除、修改,可从三个方向推导出来,dp[i][j] = Math.min(Math.min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1])+1;

qq_43511039的博客 753

力扣爆刷第105天之CodeTop100五连刷11-15

对于不持有可以是之前就不持有了,也可以是今天才持有的。那么本题就可以不停的二分,然后进入其中的顺序区间,看看target是否在这段顺序区间内(通过两端数值即可判断),在的话就往其内移动指针,不在就往反方向移动指针,即可。题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/思路:求最长回文子串,要以单点为中心或以双点为中心,向左右进行扩散,然后遍历字符串,在每一个点位上向两边进行扩散,然后记录即可。

qq_43511039的博客 885

力扣爆刷第110天之CodeTop100五连刷36-40

思路:定义dp[i][j]表示以text1[i]和text2[j]为结尾的最长公共子序列,利用这个定义,进行状态推导,如果结尾元素相等,自然各由上一个位置推出,dp[i][j] = dp[i-1][j-1] + 1。题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/description/题目链接:https://leetcode.cn/problems/binary-search/description/

qq_43511039的博客 346

算法题到底该怎么刷?高效刷题方法

算法题到底该怎么刷?高效刷题方法

weixin_41171614的博客 4102

力扣爆刷第115天之CodeTop100五连刷61-65

思路:使用栈,栈内存索引,遇到左括号,入栈,遇到右括号出栈,故栈底要初始化一个值,来满足计算括号长度,举例(),可以压入-1,左括号再压入0,右括号来了,0出栈,i= 1,减去栈顶的-1,长度为2,初始化验证完毕。思路:判断是否是二叉树,关键在于每个节点的左右子树高度差不能大于1,所以一直后序遍历求深度,在其过程中判断是否非法,非法记录全局变量,即可,另外可以早停利用全局变量。题目链接:https://leetcode.cn/problems/symmetric-tree/description/

qq_43511039的博客 560
上一篇: 代码随想录五刷day12
乱世在摸鱼
博客等级 码龄6年 618粉丝 296原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乱世在摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值