力扣剑指Offer(四)

1、矩阵中的路径

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。

示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2:

输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false

方法:回溯法(DFS+剪枝)

class Solution {
public:
    int dx[4]={0,1,0,-1};
    int dy[4]={1,0,-1,0};
    queue<pair<int,int>> q;
    bool flag;
    vector<vector<char>> board;
    string word;
    int m,n;
    bool visited[205][205];
    bool exist(vector<vector<char>>& board, string word) {
        int m=board.size();
        if(!m) return false;
        int n=board[0].size();
        if(!n) return false;
        this->m=m;
        this->n=n;
        this->board=board;
        this->word=word;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++){
                if(board[i][j]==word[0]){
                    visited[i][j]=true;
                    dfs(i,j,1);
                    if(flag)
                        return true;
                    visited[i][j]=false;
                }
            }
        return false;
    }
    void dfs(int x,int y,int k){
        if(k==word.size()){
            flag=true;
            return;
        }   
        for(int i=0;i<4;i++){
            int xx=dx[i]+x;
            int yy=dy[i]+y;
            if(xx>=0&&yy>=0&&xx<m&&yy<n){
                if(!visited[xx][yy]&&word[k]==board[xx][yy]){
                    visited[xx][yy]=true;
                    dfs(xx,yy,k+1); 
                    visited[xx][yy]=false;   
                    if(flag)
                        break;          
                }
            }
        }
        return;
    }
};

2、0~n-1中缺失的数字

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

示例 1:

输入: [0,1,3]
输出: 2

示例 2:

输入: [0,1,2,3,4,5,6,7,9]
输出: 8

限制:

1 <= 数组长度 <= 10000

方法:二分

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n=nums.size();
        int l=0,r=n-1;
        int mid;
        while(l<r){
            mid=(l+r)/2;
            if((nums[mid])==mid)
                l=mid+1;
            else
                r=mid;
        }
        return nums[l]==l?l+1:l;
    }
};
posted @ 2021-05-12 14:54  Barrymeng  阅读(69)  评论(0)    收藏  举报