剑指 Offer 10-12 共四个题

在这里插入图片描述

原题链接

class Solution {
    public int fib(int n) {
        int a = 0, b = 1, sum;
        for(int i = 0; i < n; i++){
            sum = (a + b) % 1000000007;
            a = b;
            b = sum;
        }
        return a;
    }
}


class Solution {
    int mod = (int)1e9+7;
    public int fib(int n) {
        if(n <= 1) return n;
        int a = 0, b = 1;
        for(int i = 2; i <= n; i++){
            int c = a + b;
            c %= mod;
            a = b;
            b = c;
        }
        return b;
    }
}

在这里插入图片描述
原题链接

  1. 为什么初始条件 a 和 b 都是1
  2. 想成数学问题,要满足f(n) = f(n-1)+f(n-2),即要满足f(2) = f(1)+f(0),逆推得证f(0) = 1
  3. 假设n 为3,则计算有几种方法:关于for循环的设计,可以带入n = 3 手算
class Solution {
    public int numWays(int n) {
        int a = 1, b = 1, sum;
        for(int i = 0; i < n; i++){
            sum = (a + b) % 1000000007;
            a = b;
            b = sum;
        }
        return a;
    }
}

在这里插入图片描述

原题链接

class Solution {
    public int minArray(int[] numbers) {
        int i = 0;
        int j = numbers.length - 1;
        while(i < j){
            int mid = (i + j) / 2;
            if(numbers[mid] > numbers[j]) i = mid + 1;
            else if(numbers[mid] < numbers[j]) j = mid;
            else j--;
        }
        return numbers[i];
    }
}



class Solution {
    public int minArray(int[] numbers) {
        int i = 0, j = numbers.length - 1;
        while (i < j) {
            int m = (i + j) / 2;
            //当中值大于最后一个位置,则说明现在中值在左侧
            if (numbers[m] > numbers[j]) i = m + 1;
            //中值在右侧
            else if (numbers[m] < numbers[j]) j = m;
            //当中值与其相等的时候,说明找到了位置,此时的j--,因此不满足while的条件,然后退出
            else j--;
        }
        return numbers[i];
    }
}

在这里插入图片描述
原题链接

  1. 在主函数中双层for循环,不断寻找满足条件的第一个位置
  2. 在dfs中 先判断是否越界 以及 当前位置的board 的值 是否和 words中的第k个元素相等,若相等则执行后序的递归
  3. 递归的截止条件 当 k 和 words.length - 1 相等的时候,说明所有的 words的元素都已经找到了,则返回true,这个true会通过递归赋值给res,在函数的末尾将res 返回
  4. 在主函数中,若dfs()判断为true,则返回true,反之,执行完for循环后,返回false
class Solution {
    public boolean exist(char[][] board, String word) {
        char[] words = word.toCharArray();
        for(int i = 0; i < board.length; i++){
            for(int j = 0; j < board[0].length; j++){
                if(dfs(board, words, i, j, 0)) return true;
            }
        }
        return false;
    }
    public boolean dfs(char[][] board, char[] words, int i, int j, int k){
        //截止条件
        if(i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] != words[k]) return false;
        if(k == words.length - 1) return true;
        //标记该位置已经判断过了
        board[i][j] = '\0';
        boolean res = dfs(board, words, i + 1, j, k + 1) || dfs(board, words, i - 1, j, k + 1) || 
                      dfs(board, words, i, j + 1, k + 1) || dfs(board, words, i , j - 1, k + 1);
        board[i][j] = words[k];
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值