【D27】单词搜索&寻找旋转排序数组中的最小值(LC 79&153)

79. 单词搜索

题目描述

给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

解题思路

深度优先遍历 + 回溯。

代码实现

class Solution {
    char[] target;

    public boolean exist(char[][] board, String word) {
        if(word.length() == 0){
            return false;
        }
        target = word.toCharArray();

        //遍历矩阵行列
        int rows = board.length, cols = board[0].length;
        for(int i = 0; i < rows; i++){
            for(int j = 0; j < cols; j++){
                if(check(board, i, j, 0)){
                    return true;
                } 
            }
        }
        return false;
    }

    //判断从board[i][j]出发是否存在路径word.subString(index, length - 1)
    public boolean check(char[][] board, int i, int j, int index){
        if(index >= target.length){
            //已找完全部
            return true;
        }

        if(outOfBound(board, i, j) || board[i][j] != target[index]){
            return false;
        }
        
        //防止重复查找
        board[i][j] = '0';

        if(check(board, i + 1, j, index + 1) || check(board, i - 1, j, index + 1)
        || check(board, i, j + 1, index + 1) || check(board, i, j - 1, index + 1)){
            return true;
        }

       //还原数组元素(撤销选择)
        board[i][j] = target[index];

        return false;
    }

    //判断数组下标是否越界
    public boolean outOfBound(char[][] board, int i, int j){
        if(i < 0 || i >= board.length || j < 0 || j >=board[0].length){
            return true;
        }
        return false;
    }

}

153. 寻找旋转排序数组中的最小值

问题描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] 。
请找出其中最小的元素。

  • 1 <= nums.length <= 5000
  • -5000 <= nums[i] <= 5000
  • nums 中的所有整数都是 唯一 的
  • nums 原来是一个升序排序的数组,但在预先未知的某个点上进行了旋转

解题思路1-暴力法

从头到尾遍历数组,找到最小值。

代码实现1-暴力法

class Solution {
    public int findMin(int[] nums) {
        int min = nums[0];
        for(int i = 1; i < nums.length; i++){
            if(nums[i] < min){
                min = nums[i];
            }
        }
        return min;
    }
}
  • 时间复杂度O(n),n为数组中的元素

解题思路2-二分查找

使用左闭右开区间,保证最小值始终在这里面。

代码实现2-二分查找

class Solution {
    public int findMin(int[] nums) {
        int left = 0, right = nums.length - 1;
        if(nums[left] < nums[right]){
            //数组未被旋转,直接返回最小值
            return nums[left];
        }

        while(left < right){
            int mid = left + (right - left) / 2;
            if(nums[right] < nums[mid]){
                left = mid + 1;
            }else{
                right = mid;
            } 
        }

        return nums[left];
    }
}

你可能感兴趣的:(【D27】单词搜索&寻找旋转排序数组中的最小值(LC 79&153))