剑指 Offer 11. 旋转数组的最小数字、12.矩阵中的路径

文章介绍了两种算法问题的解决方案:一是使用二分查找法找到旋转数组中的最小数字;二是利用回溯法在矩阵中寻找指定单词的路径。对于旋转数组,关键在于确定旋转点,二分查找能有效减少查找次数。在矩阵路径问题中,深度优先搜索(DFS)策略用于遍历所有可能的路径,直到找到目标单词。
摘要由CSDN通过智能技术生成

旋转数组的最小数字

旋转数组的最小数字

思路

就是找旋转点
二分查找+去除两端的元素

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package swordPointingToTheOffer;

public class eleven {

    public int minArray(int[] numbers) {
        if(numbers.length==1){
            return numbers[0];
        }

        int l = 0;
        int r = numbers.length-1;

        while (l < r){
            //已经正序了
            if(numbers[l]<numbers[r]){
                return numbers[l];
            }
            //二分查找
            int mid = (r+l)/2;
            if(numbers[mid]>numbers[l]){
                l = mid+1;  //砍左边
            }else if(numbers[mid]<numbers[l]){
                r = mid;   //砍右边
            }else {
                //重复元素的情况(去头就行)
                l++;
            }
        }
        return numbers[l];
    }
    public static void main(String[] args) {
        int[] numbers = {3,4,5,1,2};
        eleven eleven = new eleven();

        System.out.println(eleven.minArray(numbers));
    }
}

在这里插入图片描述

矩阵中的路径

矩阵中的路径

回溯法

在这里插入图片描述

找bfce

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package swordPointingToTheOffer;

public class Twelve {

    int n;
    int m;
    int len;
    boolean[][] visited;
    public boolean exist(char[][] board, String word) {
        this.n = board.length;//行
        this.m = board[0].length;//列
        this.len = word.length();
        visited = new boolean[n][m];

        for (int i =0;i<n;i++){
            for (int j =0;j<m;j++){
                if(dfs(board,i,j,word,0)){
                    //找到了路径
                    return true;
                }
            }
        }
        //找不到路径
        return false;
    }

    boolean dfs(char[][] board,int i, int j, String word,int k){
        if(i<0||i>=n||j<0||j>=m||visited[i][j]||board[i][j]!=word.charAt(k)){
            return false;
        }
        //已经全部查找完毕了
        if(k ==len-1){
            return true;
        }
        //到这说明当前位置的board元素匹配到了word(默认都是false)
        visited[i][j] = true;
        //再从当前位置的右、下、左、上   (回溯)
        boolean res = dfs(board,i,j+1,word,k+1)||
                      dfs(board,i+1,j,word,k+1)||
                      dfs(board,i,j-1,word,k+1)||
                      dfs(board,i-1,j,word,k+1);
        //回溯回去,当前位置置空(没有访问)
        visited[i][j] = false;
        return res;
    }

    public static void main(String[] args) {
        char[][] board = {{'a','b','c','e'},{'s','f','c','s'},{'a','d','e','e'}};
        String word = "abcced";
        Twelve twelve = new Twelve();
        System.out.println(twelve.exist(board,word));

    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值