Leetcode - W4,5

树:

递归(110):110. Balanced Binary Tree https://leetcode.com/problems/balanced-binary-tree/description/

public boolean isBalanced(TreeNode root) {
         if(root==null) return true;
         if(Math.abs(depth(root.left)-depth(root.right))>1) return false;
         return isBalanced(root.left)&&isBalanced(root.right);
    }
public static int depth(TreeNode root){
       if(root==null) return 0;
        return Math.max(depth(root.left),depth(root.right))+1;
    }

层次遍历(513):513. Find Bottom Left Tree Value https://leetcode.com/problems/find-bottom-left-tree-value/description/

class Solution {
    int maxDepth = -1;
    int value = 0;
    public int findBottomLeftValue(TreeNode root) {
        inOrder(root, 0);
        return value;
    }
    
    public void inOrder(TreeNode root, int depth){
        if(root==null){
            return;
        }
        if(maxDepth<depth){
            maxDepth = depth;
            value = root.val;
        }  
        inOrder(root.left, depth+1);
        inOrder(root.right, depth+1);
    }
}

 

前中后序遍历(144):https://leetcode.com/problems/binary-tree-preorder-traversal/description/

List<Integer> result = new ArrayList<Integer>();
    public List<Integer> preorderTraversal(TreeNode root) {
        if(root==null) return result;
        if(root!=null) result.add(root.val);
        if(root.left!=null) preorderTraversal(root.left);
        if(root.right!=null) preorderTraversal(root.right);
        return result;
    }

 

public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if (root == null) return list;
        Stack<TreeNode> stack = new Stack<>();
        
        TreeNode node = root;
        while (!stack.empty() || node != null){
            if(node != null){
                stack.push(node);
                list.add(node.val);
                node = node.left;
            } else {
                node = stack.pop();
                node = node.right;
            }
        }
        return list;
    }

BST(230):https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/

public int kthSmallest(TreeNode root, int k) {
        Stack s = new Stack<>();
        while (root != null || !s.empty()){
            while (root != null){
            s.add(root);
            root = root.left; }
        root = (TreeNode)s.pop();
        if (--k == 0) break;
        root = root.right;
            }
        return root.val;
    }

 

int n = 0;
    public int kthSmallest(TreeNode root, int k) {
        return dfs(root, k).val;
    }
    
    private TreeNode dfs(TreeNode root, int k) {
        if(root == null) {
            return null;
        }
        TreeNode node = dfs(root.left, k);
        if(node != null) return node;
        n++;
        if(n == k) {
            return root;
        }
        return dfs(root.right, k);
    }

 

Trie(208):https://leetcode.com/problems/implement-trie-prefix-tree/description/

 

图:

二分图(785):785. Is Graph Bipartite? https://leetcode.com/problems/is-graph-bipartite/description/

public boolean isBipartite(int[][] graph) {
        int r = graph.length;
        int [] color = new int[r];
        color[0]=1;
        for(int i=0;i<graph.length;i++){
            for(int j=0;j<graph[i].length;j++){
                if(color[graph[i][j]]==0) color[graph[i][j]]= ~color[i];
                else if(color[graph[i][j]]==color[i]) return false;
            }
        }
        return true;
    }
class Solution {
    
    private enum Color {
        NONE, BLUE, WHITE;
    }
    
    public boolean isBipartite(int[][] graph) {
        Map<Integer, Color> map = new HashMap<>();
        
        for (int i = 0; i < graph.length; ++i) map.put(i, Color.NONE);
        
        for (int i = 0; i < graph.length; ++i) {
            if (map.get(i) == Color.NONE) {
                if(!dfs(i, graph, map, Color.BLUE)) return false;
            } 
        } 
        
        return true;
    }
    
    private boolean dfs(int root, int[][] graph, Map<Integer, Color> visited, Color desiredColor) {
        if (visited.get(root) != Color.NONE) return visited.get(root) == desiredColor;
        
        visited.put(root, desiredColor);
        
        boolean bipartite = true;
        for (int edge : graph[root]) {
            bipartite &= dfs(edge, graph, visited, desiredColor == Color.BLUE ? Color.WHITE : Color.BLUE);
        }
        
        return bipartite;
    }
}
//更通用的版本

 

拓扑排序(207):207. Course Schedule https://leetcode.com/problems/course-schedule/description/

 public boolean canFinish(int numCourses, int[][] prerequisites) {//找环,若存在,则条件不满足,Kahn's Algorithm
        int[] reqCnt = new int[numCourses];
        Stack<Integer> st = new Stack<>();
        int totalCount = 0;
        
        for(int i = 0; i < prerequisites.length; i++){
            reqCnt[prerequisites[i][0]]++;
        }
        
        for(int i = 0; i < numCourses; i++){
            if(reqCnt[i] == 0){
                st.push(i);
                totalCount++;
            }
        }//st存储的是入度为0的点
        
        if(st.isEmpty())
            return false;
            
        while(!st.isEmpty()){
            int val = st.pop();
            for(int i = 0; i < prerequisites.length; i++){
                if(prerequisites[i][1] == val){
                    reqCnt[prerequisites[i][0]]--;
                    if(reqCnt[prerequisites[i][0]] == 0){
                        st.push(prerequisites[i][0]);
                        totalCount++;
                    }
                }
            }
        }
        
        if(totalCount == numCourses)
            return true;
        return false;
    }

 

并查集(684):684. Redundant Connection https://leetcode.com/problems/redundant-connection/description/

class Solution {
    public int[] findRedundantConnection(int[][] edges) {
        int[] father = new int[1001];
        for (int i = 1; i <= 1000; i++) {
            father[i] = i;
        }
        for (int i = 0; i < edges.length; i++) {
            int rootA = findFather(father, edges[i][0]);
            int rootB = findFather(father, edges[i][1]);
            if (rootA == rootB) return edges[i];
            father[rootA] = rootB;
        }
        return new int[2];
    }
   
    public int findFather(int[] father, int x) {
        if (x == father[x]) return x;
        return father[x] = findFather(father, father[x]);
    }
}

搜索:

BFS(279):https://leetcode.com/problems/perfect-squares/description/

public int numSquares(int n) {
        int[] ret = new int[n + 1];
        Arrays.fill(ret, Integer.MAX_VALUE);
        ret[0] = 0;
        ret[1] = 1;
        for(int i = 1; i <= n; i++){
            for(int j = 1; j * j <= i; j++){
                ret[i] = Math.min(ret[i - j * j] + 1, ret[i]);
            }
        }
        return ret[n];
    }

 

DFS(695):https://leetcode.com/problems/max-area-of-island/description/

class Solution {         //size函数能够传递地址
    public static int maxAreaOfIsland(int[][] grid) {
        if (grid == null || grid.length == 0 || grid[0].length == 0)
            return 0;
        int size[] = {0};
        int maxSize = 0;
        int m = grid.length;
        int n = grid[0].length;

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == 1) {
                    size[0] = 0;
                    
                    dfs(grid, m, n, i, j, size);
                    
                    maxSize = Math.max(maxSize, size[0]);
                }
            }
        }
        return maxSize;
    }

    private static void dfs(int[][] grid, int m, int n, int i, int j, int[] size) {

        if (!isSafe(grid, m, n, i, j))
            return ;
        
        grid[i][j] = 0;
        
        size[0]++;
        
        dfs(grid, m, n, i + 1, j, size);
        dfs(grid, m, n, i - 1, j, size);
        dfs(grid, m, n, i, j + 1, size);
        dfs(grid, m, n, i, j - 1, size);

    }

    private static boolean isSafe(int[][] grid, int m, int n, int r, int c) {
        if (r >= 0 && c >= 0 && r < m && c < n && grid[r][c] == 1)
            return true;
        return false;
    }
}

 

Backtracking(17):17. Letter Combinations of a Phone Number https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/

class Solution {
    public List<String> letterCombinations(String digits) {
        List<String> list = new ArrayList<>();
        String[] map = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        letterCombinations(digits, "", list, map);
        return list;
    }
    
    private void letterCombinations(String digits, String prefix, List<String> list, String[] map) {
        if (digits.length() == prefix.length()) {
            if (prefix.length() > 0)
                list.add(prefix);
            return;
        }
        int digit = digits.charAt(prefix.length()) - '0';
        for(char c : map[digit].toCharArray()) {
            letterCombinations(digits, prefix + c, list, map);
        }
    }
}

 

 

动态规划:

斐波那契数列(70):70. Climbing Stairs https://leetcode.com/problems/climbing-stairs/description/

public int climbStairs(int n) {
        if(n==0||n==1) return 1;
        if(n==2) return 2;
        int p = 1, t = 1;
        for(;n>0;n--){
            t += p;
            p = t - p;
        }
        return p;
    }

 

矩阵路径(64):64. Minimum Path Sum https://leetcode.com/problems/minimum-path-sum/description/

public int minPathSum(int[][] grid) {
        int rows = grid.length;
        int cols = grid[0].length;
        int[][] dp = new int[rows][cols];
        for(int i = 0; i < rows; i++){
            for(int j = 0; j < cols; j++){
                if(i == 0 && j == 0){
                    dp[i][j] = grid[i][j];
                }
                else if(i == 0){
                    dp[i][j] = grid[i][j] + dp[i][j-1];
                }
                else if(j == 0){
                    dp[i][j] = grid[i][j] + dp[i-1][j];
                }
                else{
                    dp[i][j] = grid[i][j] + Math.min(dp[i][j-1],dp[i-1][j]);
                }
            }
        }
        
        return dp[rows-1][cols-1];
    }

 

数组区间(303):303. Range Sum Query - Immutable https://leetcode.com/problems/range-sum-query-immutable/description/

class NumArray {

    int[] sum;
    public NumArray(int[] nums) {
        sum = new int[nums.length+1];
        sum[0] = 0;
        for(int i = 0; i < nums.length; i++){
            sum[i+1] = sum[i] + nums[i];
        }
    }
    
    public int sumRange(int i, int j) {
        return sum[j+1] - sum[i];
    }
}

 

分割整数(343):343. Integer Break https://leetcode.com/problems/integer-break/description/

public int integerBreak(int n) {
        if(n==2) return 1;
        if(n==3) return 2;
        int three = n / 3;
        int two = 0;
        if((n - 3*three)==1)  {two = 2; three -=1;}
        else two = (n - 3*three) / 2;
        return (int)(Math.pow(3,three) * Math.pow(2,two));
    }

 

最长递增子序列(300):300. Longest Increasing Subsequence https://leetcode.com/problems/longest-increasing-subsequence/description/ eg [10,9,2,5,3,7,101,18] ----> 4

public int lengthOfLIS(int[] nums) {
        if(nums==null) return 0;
        if(nums.length<=1) return nums.length;
        int [] top = new int[nums.length];
        int size = 0;
        for(int i=0;i<nums.length;i++){
            int idx = binarySearch(top, nums[i], size);
            top[idx] = nums[i];
            if(idx==size) size++;
        }
        return size;
    }
    private int binarySearch(int[] nums, int val, int end){
        int left = 0, right = end;
        if(nums[left]>=val) return left;
        while(left+1<right){
            int mid = left + (right - left)/2;
            if(nums[mid]>=val) right = mid;
            else left = mid;
        }
        return right;
    }

0-1 背包(416):416. Partition Equal Subset Sum https://leetcode.com/problems/partition-equal-subset-sum/description/ eg【1,2,3,4】

public boolean canPartition(int[] nums) {
        int sum = 0;
        for(int num : nums) sum += num;
        if(sum % 2 != 0) return false;
        sum /= 2;
        //dp[i] is whether can get result i
        boolean[] dp = new boolean[sum+1];
        dp[0] = true;
        for(int num : nums){//use number num
            for(int i=sum; i>=0; i--){
                // still remain i to get?
                if(i>=num){//dp[num] 为 true
                    dp[i] = dp[i] || dp[i-num];
                }
            }
        }
        return dp[sum];
    }

 

股票交易(309):https://leetcode.com/probl9ems/best-time-to-buy-and-sell-stock-with-cooldown/description/

字符串编辑(583):https://leetcode.com/problems/delete-operation-for-two-strings/description/

posted @ 2019-09-25 08:54  weisman  阅读(144)  评论(0编辑  收藏  举报