剑指offer个人答案(Java版)-2

本文档涵盖三个主题:深度探讨矩阵路径的回溯算法,剪绳子问题的动态规划解法,以及二进制中1的计数技巧。通过实例演示和代码实现,解析这些基本算法在计算机科学中的应用。
摘要由CSDN通过智能技术生成

12. 矩阵中的路径

class Solution {

     public static boolean dfs(char[][] board, char[] word, int i, int j, int k){
        // 2. 判断越界
        if (i>=board.length || i<0 || j>=board[0].length || j<0
                || board[i][j] != word[k]) return false;
        // 3. 判断单词单词结束
        if (k==word.length-1) return true;
        // 4. 先设为空 防止重复访问
        board[i][j] = ' ';
        // 5. 检查四个方向
        boolean res = dfs(board, word, i+1, j, k+1) || dfs(board, word, i-1, j, k+1) ||
                      dfs(board, word, i, j+1, k+1) || dfs(board, word, i, j-1, k+1);
        board[i][j] = word[k];
        return res;
    }

    public boolean exist(char[][] board, String word) {
         char[] words = word.toCharArray();
        // 1. 遍历二维数组
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                // 只有true才返回, false继续遍历
                if(dfs(board, words, i, j, 0)) return true;
            }
        }
        return false;
    }   
}

14- I. 剪绳子

class Solution {
    public int cuttingRope(int n) {
        int[] dp = new int[n+1];
        dp[2] = 1;
        for (int i = 0; i < n+1; i++) {
            for (int j = 0; j < i; j++) {
                dp[i] = Math.max(dp[i], Math.max(j*(i-j), j*dp[i-j]));
            }
        }
        return dp[n];
    }
}

15. 二进制中1的个数

public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int data=0;
        while (n!=0) {
            if((n&1)==1) data++;
            n = n>>>1;
        }
        return data;
    }
}

16. 数值的整数次方

class Solution {
    public double myPow(double x, int n) {
       if(x == 0) return 0;
        long b = n;
        double res = 1.0;
        if(b < 0) {
            x = 1 / x;
            b = -b;
        }
        while(b > 0) {
            if((b & 1) == 1) res *= x;
            x *= x;
            b >>= 1;
        }
        return res;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值