LeetCode,无它,唯手熟尔(四)

大家好,我是方圆
无它,唯手熟尔


递归

21. 合并两个有序链表

class Solution {
    
    
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    
    
        if(l1 == null) return l2;
        if(l2 == null) return l1;

        if(l1.val < l2.val) {
    
    
            l1.next = mergeTwoLists(l1.next,l2);
            return l1;
        }else {
    
    
            l2.next = mergeTwoLists(l1,l2.next);
            return l2;
        }
    }
}

101. 对称二叉树

class Solution {
    
    
    public boolean isSymmetric(TreeNode root) {
    
    
        return isMirror(root,root);
    }

    private boolean isMirror(TreeNode node1, TreeNode node2) {
    
    
        if(node1 == null && node2 == null) return true;
        if(node1 == null || node2 == null) return false;

        return (node1.val == node2.val) && isMirror(node1.left,node2.right)
                && isMirror(node1.right,node2.left);
    }
}

104. 二叉树的最大深度

class Solution {
    
    
    public int maxDepth(TreeNode root) {
    
    
        if(root == null) return 0;

        int left = maxDepth(root.left);
        int right = maxDepth(root.right);

        return Math.max(left,right) + 1;
    }
}

226. 翻转二叉树

class Solution {
    
    
    public TreeNode invertTree(TreeNode root) {
    
    
        if(root == null) return null;

        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;

        invertTree(root.left);
        invertTree(root.right);

        return root;
    }
}

236. 二叉树的最近公共祖先

class Solution {
    
    
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    
    
        if(root == null || root == p || root == q) return root;

        TreeNode left = lowestCommonAncestor(root.left,p,q);
        TreeNode right = lowestCommonAncestor(root.right,p,q);

        if(left == null && right == null)  return null;
        if(left == null) return right;
        if(right == null) return left;

        return root;
    }
}

分治法、二分法

23. 合并K个升序链表

class Solution {
    
    
    public ListNode mergeKLists(ListNode[] lists) {
    
    
        if(lists == null || lists.length == 0) return null;

        return helper(lists,0,lists.length - 1);
    }

    private ListNode helper(ListNode[] lists, int left, int right) {
    
    
        if(left == right) return lists[left];

        int mid = (left + right) / 2;
        ListNode head = helper(lists,left,mid);
        ListNode tail = helper(lists,mid + 1,right);
        return merge(head,tail);
    }

    private ListNode merge(ListNode head, ListNode tail) {
    
    
        if(head == null) return tail;
        if(tail == null) return head;

        if(head.val < tail.val) {
    
    
            head.next = merge(head.next,tail);
            return head;
        }else {
    
    
            tail.next = merge(head,tail.next);
            return tail;
        }
    }
}

33. 搜索旋转排序数组

class Solution {
    
    
    public int search(int[] nums, int target) {
    
    
        int left = 0, right = nums.length - 1;

        while(left <= right) {
    
    
            int mid = (left + right) / 2;

            if(target == nums[mid]) return mid;

            if(nums[mid] >= nums[left]) {
    
    
                if(target >= nums[left] && target <= nums[mid])
                    right = mid - 1;
                else 
                    left = mid + 1;
            }else {
    
    
                if(target >= nums[mid] && target <= nums[right])
                    left = mid + 1;
                else 
                    right = mid - 1;
            }
        }

        return  -1;
    }
}

34. 在排序数组中查找元素的第一个位置和最后一个位置

class Solution {
    
    
    public int[] searchRange(int[] nums, int target) {
    
    
        int left = 0, right = nums.length - 1;

        while(left <= right) {
    
    
            int mid = (left + right) / 2;

            if(target > nums[mid]) {
    
    
                left = mid + 1;
            }else if(target < nums[mid]) {
    
    
                right = mid - 1;
            }else {
    
    
                left = mid;
                right = mid;
                while(left > 0 && nums[left - 1] == target) left--;
                while(right < nums.length - 1 && nums[right + 1] == target) right++;

                return new int[] {
    
    left,right};
            }
        }

        return new int[] {
    
    -1,-1};
    }
}

动态规划

5. 最长回文子串

class Solution {
    
    
    public String longestPalindrome(String s) {
    
    
        int len = s.length();
        if(len < 2) return s;

        int maxLen = 1;
        int begin = 0;
        char[] chars = s.toCharArray();
        boolean[][] dp = new boolean[len][len];
        for(int i = 0; i < len; i++) dp[i][i] = true;

        for(int j = 1; j < len; j++) {
    
    
            for(int i = 0; i < j; i++) {
    
    
                if(chars[i] != chars[j]) dp[i][j] = false;
                else{
    
    
                    if(j - i < 3) dp[i][j] = true;
                    else {
    
    
                        if(dp[i + 1][j - 1]) dp[i][j] = true;
                    }
                }

                if(dp[i][j] && j - i + 1 > maxLen) {
    
    
                    maxLen = j - i + 1;
                    begin = i;
                }
            }
        }

        return s.substring(begin,begin + maxLen);
    }
}

53. 最大子序和

class Solution {
    
    
    public int maxSubArray(int[] nums) {
    
    
        if(nums == null || nums.length == 0) return 0;

        int res = nums[0];
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        for(int i = 1; i < nums.length; i++) {
    
    
            if(dp[i - 1] >= 0) dp[i] = nums[i] + dp[i - 1];
            else dp[i] = nums[i];
            if(dp[i] > res) res = dp[i];
        }

        return res;
    }
}

62. 不同路径

class Solution {
    
    
    public int uniquePaths(int m, int n) {
    
    
        int[][] dp = new int[m][n];
        for(int i = 0;i < n; i++) dp[0][i] = 1;
        for(int j = 0;j < m; j++) dp[j][0] = 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];
    }
}

64. 最小路径和

class Solution {
    
    
    public int minPathSum(int[][] grid) {
    
    
        int m = grid.length, n = grid[0].length;

        for(int i = 1; i < n; i++) grid[0][i] += grid[0][i - 1];
        for(int j = 1; j < m; j++) grid[j][0] += grid[j - 1][0];

        for(int i = 1; i < m; i++) {
    
    
            for(int j = 1; j < n; j++) {
    
    
                grid[i][j] += Math.min(grid[i - 1][j],grid[i][j - 1]); 
            }
        }

        return grid[m - 1][n - 1];
    }
}

70. 爬楼梯

class Solution {
    
    
    public int climbStairs(int n) {
    
    
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;

        for(int i = 2; i <= n; i++) {
    
    
            dp[i] = dp[i - 1] + dp[i - 2];
        }

        return dp[n];
    }
}

118. 杨辉三角

class Solution {
    
    
    public List<List<Integer>> generate(int numRows) {
    
    
        List<List<Integer>> res = new ArrayList<>(numRows);

        for(int i = 0; i < numRows; i++) {
    
    
            List<Integer> temp = new ArrayList<>(i + 1);
            for(int j = 0; j <= i; j++) {
    
    
                if(j == 0 || j == i) temp.add(1);
                else {
    
    
                    List<Integer> pre = res.get(i - 1);
                    temp.add(pre.get(j - 1) + pre.get(j));
                }
            }
            res.add(temp);
        }

        return res;
    }
}

300. 最长上升子序列

class Solution {
    
    
    public int lengthOfLIS(int[] nums) {
    
    
        int[] dp = new int[nums.length];
        Arrays.fill(dp,1);
        int res = 0;

        for(int i = 0; i < nums.length; i++) {
    
    
            for(int j = 0; j < i; j++) {
    
    
                if(nums[j] < nums[i]) dp[i] = Math.max(dp[i],dp[j] + 1);
            }
            if(dp[i] > res) res = dp[i];
        }

        return res;
    }
}

1143. 最长公共子序列

class Solution {
    
    
    public int longestCommonSubsequence(String text1, String text2) {
    
    
        int m = text1.length(), n = text2.length();
        int[][] dp = new int[m + 1][n + 1];
        dp[0][0] = 0;

        for(int i = 0; i < m; i++) {
    
    
            for(int j = 0; j < n; j++) {
    
    
                char c1 = text1.charAt(i), c2 = text2.charAt(j);
                if(c1 == c2) dp[i + 1][j + 1] = dp[i][j] + 1;
                else {
    
    
                    dp[i + 1][j + 1] = Math.max(dp[i][j + 1],dp[i + 1][j]);
                }
            }
        }

        return dp[m][n];
    }
}

1277. 统计全为1的正方形子矩阵

class Solution {
    
    
    public int countSquares(int[][] matrix) {
    
    
        int m = matrix.length, n = matrix[0].length;
        int[][] dp = new int[m][n];
        int res = 0;

        for(int i = 0;i < n; i++) {
    
    
            dp[0][i] = matrix[0][i];
            res += dp[0][i];
        }
        for(int j = 1; j < m; j++) {
    
    
            dp[j][0] = matrix[j][0];
            res += dp[j][0];
        }

        for(int i = 1; i < m; i++) {
    
    
            for(int j = 1; j < n; j++) {
    
    
                if(matrix[i][j] == 1){
    
    
                    dp[i][j] = Math.min(Math.min(dp[i - 1][j],dp[i][j - 1]),dp[i - 1][j - 1]) + 1;
                    res += dp[i][j];
                }
            }
        }

        return res;
    }
}

加油儿!今天就要返校了,可能这是我上大学以来要度过的最短的学期了,希望同学们都平平安安的,也希望自己在秋招能收获到满意的Offer!

猜你喜欢

转载自blog.csdn.net/qq_46225886/article/details/108234497