每日5 题

1 50 Power(x, n)

    1 确定n正负  2 结果正负  3 二分

    public double myPow(double x, int n) {
        if (n == 0) return 1.0;
        double res = 1.0;
        if (n < 0) {
            if (x < 1 / Double.MAX_VALUE && x > 1 / Double.MIN_VALUE){
                return Double.MAX_VALUE;
            } else {
                x = 1 / x;
            }
            if (n == Integer.MIN_VALUE){
                res *= x;
                n++;
            }
        }
        n = Math.abs(n);
        boolean isN = false;
        if (n % 2 == 1 && x < 0) isN = true;
        x = Math.abs(x);
        while (n > 0) {
            if ((n & 1) == 1) {
                if (res > Double.MAX_VALUE / x) {
                    return Double.MAX_VALUE;
                }
                res *= x;
            }
            x *= x;
            n >>= 1;
        }
        return isN ? -res : res;
    }
View Code

2 49 Group Anagrams

    分成字母,排序

    public List<List<String>> groupAnagrams(String[] strs) {
        if (strs == null || strs.length == 0) return new ArrayList<List<String>>();
        HashMap<String, List<String>> map = new HashMap<>();
        for (String str : strs) {
            char[] arr = str.toCharArray();
            Arrays.sort(arr);
            String item = new String(arr);
            if (!map.containsKey(item)){
                map.put(item, new ArrayList<String>());
            }
            map.get(item).add(str);
        }
        return new ArrayList<>(map.values());
    }
View Code

3 48 Rotate Image

    上下翻, \ 对称翻

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

6 45 Jump Game II 

     当前最远,之前最远大,跳

    public int jump(int[] nums) {
        if (nums == null || nums.length == 0)
        {
            return 0;
        }
        int gol = 0, cur = 0, step = 0;
        for (int i = 0; i < nums.length && i <= gol; i++) {
            if (cur < i) {
                cur = gol;
                step++;
            }
            gol = Math.max(gol, nums[i] + i);
        }
        if (gol < nums.length - 1) return -1;
        return step;
    }
View Code

7 44 Wildcard Matching  动态规划

    public boolean isMatch(String s, String p) {
        int m = s.length(), n = p.length();
        boolean[][] res = new boolean[m + 1][n + 1];
        res[0][0] = true;
        for (int i = 1; i <= n; i++) {
            res[0][i] = res[0][i - 1] && (p.charAt(i - 1) == '*');
        }
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (p.charAt(j - 1) == '*') {
                    res[i][j] = res[i - 1][j] || res[i][j - 1];
                } else {
                    res[i][j] = (s.charAt(i - 1) == p.charAt(j - 1) || p.charAt(j - 1) == '?') && res[i - 1][j - 1];
                }
            }
        }
        return res[m][n];
    }
View Code
    public boolean isMatch(String str, String pat) {
        int len = pat.length(), s = 0, p = 0, match = 0, index = -1;
        while (s < str.length()){
            if (p < len && (str.charAt(s) == pat.charAt(p) || pat.charAt(p) == '?')){
                s++;p++;
            } else if (p < len && pat.charAt(p) == '*'){
                index = p;
                match = s;
                p++;
            } else if (index != -1){
                p = index + 1;
                match++;
                s = match;
            } else {
                return false;
            }
        }
        while (p < len && pat.charAt(p) == '*'){
            p++;
        }
        return p == len;
    }
View Code

8 Multiply String

  乘法公式

    public String multiply(String num1, String num2) {
        int m = num1.length(), n = num2.length();
        int[] res = new int[m + n];
        for (int i = m - 1; i >= 0; i--) {
            for (int j = n - 1; j >= 0; j--) {
                int num = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
                int p1 = i + j, p2 = i + j + 1;
                int m1 = res[p2] + num;
                res[p2] = m1 % 10;
                res[p1] += m1 / 10;
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < res.length; i++) {
            if (sb.length() == 0 && res[i] == 0) continue;
            sb.append(res[i]);
        }
        return sb.length() == 0 ? "0": sb.toString();
    }
View Code

9 42 Trapping Rain Water

    public int trap(int[] height) {
        int ml = 0, mr = 0, res = 0, l = 0, r = height.length;
        while (l <= r){
            ml = Math.max(ml, height[l]);
            mr = Math.max(mr, height[r]);
            if (ml < mr){
                res += ml - height[l];
                l++;
            } else {
                res += mr - hright[r];
                r--;
            }
        }
        return res;
    }
View Code

10 40 Combination Sum ||

 递归,查看是否重复

    public List<List<Integer>> combinationSum2(int[] can, int tar) {
        List<List<Integer>> res = new ArrayList<>();
        if (can.length == 0) return res;
        Arrays.sort(can);
        help(can, tar, 0, new ArrayList<Integer>(), res);
        return res;
    }
    public void help(int[] can, int tar, int sta, ArrayList<Integer> item, List<List<Integer>> res){
        if (tar == 0){
            res.add(item);
            return;
        }
        if (tar < 0) return;
        for (int i = sta; i < can.length; i++) {
            if (i > sta && can[i] == can[i - 1]) continue;
            item.add(can[i]);
            help(can, tar - can[i], item, res);
            item.remove(item.size() - 1);
        }
    }
View Code

11 38 Count and Say

    public String countAndSay(int n) {
        if (n < 1) return "";
        String res = "1";
        for (int i = 2; i <= n; i++) {
            StringBuilder sb = new StringBuilder();
            int k = 0;
            while (k < res.length()) {
                char c = res.charAt(k++);
                int cou = 1;
                while (k < res.length() && res.charAt(k) == c){
                    k++;
                    cou++;
                }
                sb.append(cou);
                sb.append(c);
            }
            res = sb.toString();
        }
        return res;
    }
View Code

12 36 Valid Sudoku 

行和列的值

    public boolean isValidSudoku(char[][] board) {
        for (int i = 0; i < 9; i++) {
            Set<Character> row = new HashSet<>();
            Set<Character> col = new HashSet<>();
            Set<Character> cub = new HashSet<>();
            for (int j = 0; j < 9; j++) {
                if (board[i][j] != '.' && !row.add(board[i][j])) return false;
                if (board[j][i] != '.' && !row.add(board[j][i])) return false;
                int r = 3 * (i / 3), c = 3 * (i % 3);
                if (board[r + j / 3][c + j % 3] != '.' && !row.add(board[r + j / 3][c + j % 3])) return false;
            }
        }
        return true;
    }
View Code

13 37 Sudoku Solver

    public void solveSudoku(char[][] board) {
        if (board == null || board.length == 0) return;
        slove(board, 0, 0);
    }
    public boolean slove(char[][] c, int i, int j) {
        if (i == c.length) return true;
        if (j == c.length) return slove(c, i + 1, 0);
        if (c[i][j] != '.') return slove(c, i, j + 1);
        for (char k = '0'; k <= '9'; k++) {
            c[i][j] = k;
            if (isV(c, i, j)){
                return slove(c, i, j + 1);
            }
            c[i][j] = '.';
        }
     }
 private boolean isV(char[][] board, int i, int j)  
{  
    for(int k=0;k<9;k++)  
    {  
        if(k!=j && board[i][k]==board[i][j])  
            return false;  
    }  
    for(int k=0;k<9;k++)  
    {  
        if(k!=i && board[k][j]==board[i][j])  
            return false;  
    }          
    for(int row = i/3*3; row<i/3*3+3; row++)  
    {  
        for(int col=j/3*3; col<j/3*3+3; col++)  
        {  
            if((row!=i || col!=j) && board[row][col]==board[i][j])  
                return false;  
        }  
    }  
    return true;  
}  
View Code

 14 34 Search for a Range

二分

    public int[] searchRange(int[] nums, int target) {
        int[] res = new int[2]{-1,-1};
        if (nums.length == 0) return res;
        int l = 0, r = nums.length - 1;
        while (l < r) {
            int m = (r - l) / 2 + l;
            if (nums[m] < target) l = m + 1;
            else r = m;
        }
        if (nums[l] != target) return res;
        res[0] = l;
        r = nums.length - 1;
        while (l < r) {
            int m = (r - l) / 2 + l;
            if (nums[m] > target) r = m - 1;
            else l = m;
        }
        res[1] = r;
        return res;
    }
View Code

15 32 Longest Valid Parentheses

  栈

    public int longestValidParentheses(String s) {
        Stack<Integer> stack = new Stack<>();
        int start = 0, max = 0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '('){
                stack.push(i);
            } else {
                if (stack.isEmpty()){
                    start = i + 1;
                } else{
                    stack.pop();
                    int cur = stack.isEmpty() ? i - start + 1 : i - stack.peek();
                    max = Math.max(cur, max);
                }
            }
        }
        return max;
    }
View Code

16 31 Next Permutation

    public void nextPermutation(int[] nums) {
        if (nums.length < 2) return;
        int i = nums.length - 1;
        while (; i > 0; i--) {
            if (nums[i - 1] < nums[i]) break;
        }
        if (i != 0) {
            swap(i - 1, nums);
        }
        reverse(i, nums);
    }
    public void swap(int i, int[] nums) {
        int j = nums.length - 1;
        for (; j > i; j--) {
            if (nums[i] < nums[j]){
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
                return;
            }
        }
    }
    public void reverse(int i, int[] nums){
        int j = nums.length - 1;
        while (i < j) {
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
            i++;j--;
        }
    }
View Code

 

 

 

posted on 2017-08-08 10:05  wheleetcode  阅读(137)  评论(0编辑  收藏  举报